【问题标题】:A function to conduct a shapiro test on multiple variables at once一次对多个变量进行 shapiro 测试的函数
【发布时间】:2020-09-13 18:58:38
【问题描述】:

我在下面创建了类似于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))

我正在尝试创建一个函数,允许我指定数据、分组变量(RegionStateLoc)和变量列(例如,var1:var5)。我想指定 var 列作为与我指定的任何数据框相关联的列号(因此,如果我想在此处执行所有 5 个 vars,则将给出参数 5:9)。我希望该函数从 rstatix 包中进行单变量 shapiro 测试 shapiro_test(),并在 . 到目前为止,我的函数看起来像这样,主要反映了我用来在函数之外完成这项工作的工作流程:

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
}

我已经尝试了几种不同的变体,但是当我尝试运行该函数时: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. 我无法弄清楚发生了什么。

【问题讨论】:

    标签: r function functional-programming


    【解决方案1】:

    变量在函数中的评估方式不同。这将是获得所需结果的一种方法(出于说明目的使用 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
    

    reprex package (v0.3.0) 于 2020 年 5 月 26 日创建

    【讨论】:

    • 这行得通,谢谢,你能解释一下!!sym() 的目的是什么吗?
    • 查看这份备忘单,了解这些天在 tidyverse 中使用的整洁评估:psych252.github.io/psych252book/figures/cheatsheets/…。基本上,有不同的方法可以将变量作为字符向量(使用sym)或在函数上下文中进行评估的表达式传递。为了 !!见?`!!`
    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2019-04-15
    • 2021-11-11
    相关资源
    最近更新 更多