Функция для проведения теста Шапиро сразу для нескольких переменных - PullRequest
0 голосов
/ 26 мая 2020

У меня есть фреймы данных, похожие на dat1, созданные ниже:

dat1 <- data.frame(Region = rep(c("r1","r2"), each = 100),
                   State = rep(c("NY","MA","FL","GA"), each = 10),
                   Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
                   ID = rep(c(1:10), each=2),
                   var1 = rnorm(200),
                   var2 = rnorm(200),
                   var3 = rnorm(200),
                   var4 = rnorm(200),
                   var5 = rnorm(200))

Я пытаюсь создать функцию, которая позволяет мне указывать данные, группирующую переменную (Region, State, или Loc) и переменные столбцы (например, var1:var5). Я хочу указать столбцы var, которые будут включены в качестве номеров столбцов, связанных с любым указанным мной фреймом данных (поэтому здесь, если бы я хотел выполнить все 5 var s, аргументу было бы дано 5:9). Я хочу, чтобы функция проводила одномерные тесты Шапиро shapiro_test() из пакета rstatix и возвращала переменную и имя группирующей переменной, когда файл. На данный момент моя функция выглядит так, что в основном отражает рабочий процесс, который я использую для выполнения этой работы вне функции:

library(rstatix)
UnivShapiro <- function(dat, groupvar, columns){
  var.list <- paste(names(dat[columns]),collapse=",")
  result<-
    dat%>%
    group_by(paste(groupvar))%>%
    shapiro_test(vars=paste(var.list))%>%
    arrange(variable)%>%
    dplyr::filter(p<0.05)
  result
}

Я пробовал несколько разных вариантов этого, но когда я пытаюсь запустить function: UnivShapiro(dat=dat1, groupvar="Region", columns = 5:9), я получаю сообщение об ошибке: Error: Can't subset columns that don't exist. x The column var1,var2,var3,var4,var5 doesn't exist. Я не могу понять, что происходит.

1 Ответ

0 голосов
/ 27 мая 2020

Переменные в функции оцениваются по-разному. Это был бы один из способов получить желаемые результаты (для иллюстрации использовалось p <0,5): </p>

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
set.seed(1)
dat1 <- data.frame(Region = rep(c("r1","r2"), each = 100),
                   State = rep(c("NY","MA","FL","GA"), each = 10),
                   Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
                   ID = rep(c(1:10), each=2),
                   var1 = rnorm(200),
                   var2 = rnorm(200),
                   var3 = rnorm(200),
                   var4 = rnorm(200),
                   var5 = rnorm(200))
library(rstatix)
#> 
#> Attaching package: 'rstatix'
#> The following object is masked from 'package:stats':
#> 
#>     filter
UnivShapiro <- function(dat, groupvar, columns){
  var.list <- rlang::syms(names(dat[columns]))
  result<-
    dat%>%
    group_by(!!sym(groupvar))%>%
    shapiro_test(vars=var.list)%>%
    arrange(variable)%>%
    dplyr::filter(p < 0.5)
  result
}
UnivShapiro(dat1, groupvar="Region", columns=5:9)
#> # A tibble: 4 x 4
#>   Region variable statistic      p
#>   <chr>  <chr>        <dbl>  <dbl>
#> 1 r2     var1         0.974 0.0476
#> 2 r2     var2         0.985 0.339 
#> 3 r2     var4         0.977 0.0782
#> 4 r2     var5         0.981 0.162

Создано 26 мая 2020 г. пакетом REPEX ( v0.3.0)

...