在多个自动生成的数据帧上执行t.test?

时间:2016-07-14 12:23:51

标签: r dataframe

我有一个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'

也许我必须接近这个完全不同的模型/配方组合不适合这种操作。有没有人有想法让这项工作?

1 个答案:

答案 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并没有任何问题,因为我们已经在这里完成了