我正在尝试创建一个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
)。我可能正在处理此错误,因此感谢您的帮助。
答案 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)
})
顺便说一句,考虑使用by
(tapply
的面向对象的包装器,并且经常被应用族成员忽略)而不是将split
嵌套在lapply
内:
by(df, df[c("color", "phase")], function(d) {
tryCatch({ kruskal.test(val ~ distance, data=d) },
error = function(e) NA)
})