我有241列和114行的df。列60:241是数值,如果我想根据变量组(T1和T2)进行配对t检验。对于一个单独的变量,我后来用reshape2 package命令和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‘
也许我必须处理这个完全不同的方法,是模型列表/公式组合不适合这种操作。有人想办法让这件事成功吗?
发布于 2016-07-14 12:38:31
我认为您的公式/粘贴线是问题所在;您应该直接调用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 on Group和PatientID (这是等价的)。
为了收集测试结果,您需要从输出中收集所需的部分。运行str(tmp)或unclass(tmp)来查看输出的实际情况。这是一个列表,因此您可以单独使用$收集所需的片段,也可以使用[将它们一起删除。要放入一个矩阵,您需要将它们放在一起,并且由于您想要重新绑定的元素已经在列表中,所以您可以使用rbind来完成这个任务。例如
tmp <- lapply(results, function(x) unlist(x[c("statistic", "parameter",
"p.value", "conf.int", "estimate")]))
as.data.frame(do.call(rbind, tmp))Hadley Wickham的各种包提供了实现这种“拆分-应用-组合”的替代方法;如果我使用这些包,来自reshape2的reshape2和来自plyr的ddply是可以使用的,但是像我们这里所做的那样使用基R并没有什么错。
https://stackoverflow.com/questions/38374103
复制相似问题