R 使用交换行/列跨两个不同的数据帧进行t检验?
对不起,这个标题让人困惑,这个有点难以描述。基本上,我有两个类似的数据表:R 使用交换行/列跨两个不同的数据帧进行t检验?,r,subset,t-test,R,Subset,T Test,对不起,这个标题让人困惑,这个有点难以描述。基本上,我有两个类似的数据表: df1 <- data.frame(SNP=c("W", "X", "Y", "Z"), Gene.ID=c("A", "B", "C", "B"), pval=NA) df2 <- data.frame(W=c(1, 0, 1), X=c(1, 1, 0), Y=c(0, 0, 1), Z=c(1, 0, 1), A=c(3.5, 2.
df1 <- data.frame(SNP=c("W", "X", "Y", "Z"),
Gene.ID=c("A", "B", "C", "B"), pval=NA)
df2 <- data.frame(W=c(1, 0, 1), X=c(1, 1, 0), Y=c(0, 0, 1), Z=c(1, 0, 1),
A=c(3.5, 2.5, 3.5), C=c(4.5, 2.5, 1.5), B=c(1.5, 2.5, 1.5))
df1我不明白您为什么认为这不起作用-我认为您的代码中有语法错误。以下代码似乎工作正常(请注意使用sapply
,这在R中稍微有点传统):
df1[,3]此处使用which(colnames(df2)…
可能不是最佳选择,因为您只需选择df2
中包含df1[i,1]
或df1[i,2]
作为名称的列
在R中,通过名称选择列的一种方法是使用双括号:例如,df2[[“a”]
将检索df2
的a
,这似乎是您想要的,并且比df2[(colnames(df2)=“a”)]更简单
考虑到这一点,您可以像这样重写代码:
for (i in 1:nrow(df1)){
test <- t.test(df2[,which(colnames(df2)==df1[i, 1]] ~ df2[,which(colnames(df2)==df1[i, 2]])
df1[i, 3] <- test$p.value
}
for (i in 1:nrow(df1)){
test <- t.test(df2[[df1[i, 2]]] ~ df2[[df1[i, 1]]])
df1[i, 3] <- test$p.value
}
for(i in 1:nrow(df1)){
测试可能我只是做错了什么,但我似乎无法让colnames只处理一列。例如,如果我要键入colnames(df[,1])
输出为空,其中ascolnames(df[,1:2]
返回SNP和Gene.ID。查看df[,1]
vsdf[,1:2]
或df的输出[,1,drop=FALSE]
,请参阅以下部分(8.1.44和45):顺便说一句,我不是说我的话听起来很短-这是一个常见的错误,事实上,你只是希望R的行为符合逻辑和一致性-我相信随着时间的推移,你会停止这样做:)这个双括号技巧真的很方便!我没想到没有$operator你就可以做到这一点。谢谢你的提示!是的,我非常喜欢$
,它使用起来更简单,但是[…]
提供了更多的功能。
for (i in 1:nrow(df1)){
test <- t.test(df2[[df1[i, 2]]] ~ df2[[df1[i, 1]]])
df1[i, 3] <- test$p.value
}