我有一个241列和114行的df。列60:241是我想根据变量Group(T1和T2)执行配对t检验的数值。对于一个单独的变量,我设法使用reshape2 package acast命令和t.test之后执行此操作,但如果我能找到一个命令自动执行所有182个变量,它将为我节省大量的手动工作。
我尝试制作一个我想要编码的简化示例:
> df
PatientID Group Immvar1 Immvar2
1 1 T1 4 5
2 2 T1 7 8
3 2 T2 9 10
4 3 T1 2 3
5 3 T2 4 5
6 4 T1 1 2
7 4 T2 9 10
> df1 <- as.data.frame(acast(df$PatientID ~df$Group, data = df, fill=0, value.var=("Immvar1")))
> df1
T1 T2
1 4 0
2 7 9
3 2 4
4 1 9
> t.test(df1$T1,df1$T2, paired=TRUE)
我已经构建的用于自动运行的代码如下所示:
df2 <-df[,3:4]
modelList<-list()
for (i in 1:ncol(df2)) {
matrix <- formula(paste("as.data.frame(acast(PatientID ~ Group , data = df1, fill=0, value.var=(", names(df2[i]),")))"))
modelList[[i]] <-t.test(matrix$T1, matrix$T2, paired=TRUE)
}
但是在运行此命令时我总是收到错误消息:
匹配错误(x,table,nomatch = 0L):找不到对象'Immvar1'
也许我必须接近这个完全不同的模型/配方组合不适合这种操作。有没有人有想法让这项工作?
答案 0 :(得分:2)
我认为你的公式/粘贴线是问题;你应该直接调用cast函数。 (并且dcast会自动将它放入data.frame中。)如果没有可重复的示例,我无法对此进行测试,但这里猜测的是什么样子。我还使用lapply
来处理簿记。
results <- lapply(names(df)[3:4], function(n) {
matrix <- dcast(PatientID ~ Group, data = df, fill=0, value.var=n)
t.test(matrix$T1, matrix$T2, paired=TRUE)
})
另外,你确定要用零填充缺失的行吗?通常当缺少某些东西时,价值是未知的。
您可能考虑避免首先进行强制转换的其他事项是使用t.test的公式表示法(尽管它需要配对的值排列,因此缺少值会有问题),或者在组上使用双向Anova和PatientID(相当于)。
要收集测试结果,您需要从输出中收集所需的部分。运行str(tmp)
或unclass(tmp)
以查看输出的实际情况。这是一个列表,因此您可以使用$
或使用[
一起单独收集所需的部分,然后将其展开。要放入矩阵,您需要rbind
它们在一起,并且由于您想要rbind的元素已经在列表中,您可以使用do.call
来完成。例如
tmp <- lapply(results, function(x) unlist(x[c("statistic", "parameter",
"p.value", "conf.int", "estimate")]))
as.data.frame(do.call(rbind, tmp))
Hadley Wickham的各种套餐提供了另外的方法来实现这种“拆分 - 应用 - 组合”;来自melt
的{{1}}和来自reshape2
的{{1}}是我在使用这些软件包时会使用的内容,但使用base R并没有任何问题,因为我们已经在这里完成了