t.test:为多个分组级别创建lapply函数

时间:2019-03-19 19:55:06

标签: r function grouping lapply

我正在尝试创建一个lapply函数来为多个分组级别运行多个t.test。我遇到了一个问题:Kruskal-Wallis test: create lapply function to subset data.frame?,但他们只是试图按一个变量(phase)分组。我想添加另一个分组级别color,其中我的iv为distance,而dv为val,按color然后按phase分组。

# create data
val<-runif(60, min = 0, max = 100)
distance<-floor(runif(60, min=1, max=3))
phase<-rep(c("a", "b", "c"), 20)
color<-rep(c("red", "blue","green","yellow","purple"), 12)

df<-data.frame(val, distance, phase, color)

他们对phase进行分组的答案是

lapply(split(df, df$phase), function(d) { kruskal.test(val ~ distance, data=d) })

但是,它并没有为分组说明另一个级别(color)。我可能正在处理此错误,因此感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

只需将list()内的split合并到所需列上。但是,对于您的示例,由于某些组都共享相同的 distance 值,因此会产生错误。

lapply(split(df, list(df$color, df$phase)), function(d) {
    kruskal.test(val ~ distance, data=d) 
})
  

kruskal.test.default(c(76.6759299905971,3.11371604911983,   17.6471394719556 ,:所有观察结果都在同一组中

因此,请考虑包装在tryCatch中以返回NA或这些问题组的任何其他对象:

lapply(split(df, list(df$color, df$phase)), function(d) {
    tryCatch({ kruskal.test(val ~ distance, data=d) },
             error = function(e) NA)
})

顺便说一句,考虑使用bytapply的面向对象的包装器,并且经常被应用族成员忽略)而不是将split嵌套在lapply内:

by(df, df[c("color", "phase")], function(d) {
    tryCatch({ kruskal.test(val ~ distance, data=d) },
             error = function(e) NA)
})