列配对统计检验

时间:2013-03-11 14:42:22

标签: r dataframe

我有两个看起来像这样的data.frame:

DF1      
  Col1     Col2     Col3    Col4    
 0.1854   0.1660   0.1997   0.4632
 0.1760   0.1336   0.1985   0.4496
 0.1737   0.1316   0.1943   0.4446    
 0.1660   0.1300   0.1896   0.4439


DF2       
  Col1     Col2     Col3    Col4    
 0.2456    0.2107   0.2688  0.5079
 0.2399    0.1952   0.2356  0.1143
 0.2375    0.1947   0.2187  0.0846    
 0.2368    0.1922   0.2087  0.1247

我想在两个data.frames之间执行wilcox.test,特别是在配对列之间执行wilcox.test,以便:

test1: between Col1 of DF1 and Col1 of DF2     
test2: between Col2 of DF1 and Col2 of DF2      

等等。

我使用了以下脚本:

for (i in 1:length(DF2)){ 
    test <- apply(DF1, 2, function(x) wilcox.test(x, as.numeric(DF2[[i]]), correct=TRUE))
}

不幸的是,此脚本的输出与使用以下脚本执行的相同测试的输出不同:

test1 = wilcox.test(DF1[,1], DF2[,1],  correct=FALSE)     
test2 = wilcox.test(DF1[,2], DF2[,2],  correct=FALSE)       

因为在真正的data.frames中我有大约100列和200行(它们相对于维度而言)我不能按列制作测试列。

dput(DF1)之后:

structure(list(Col1 = c(0.1854, 0.1760, 0.1737, 0.1660,....),  class = "data.frame", row.names = c(NA, -100L)))

DF2

的情况相同

2 个答案:

答案 0 :(得分:6)

这是一个经典的mapply案例 - 基本上只是sapply的多变量版本。我们使用mapply依次遍历每个数据框。首先,创建一些数据:

df1 = data.frame(c1 = runif(10), c2 = runif(10), c3 = runif(10), c4 = runif(10))
df2 = data.frame(c1 = runif(10), c2 = runif(10), c3 = runif(10), c4 = runif(10))

然后使用mapply

l = mapply(wilcox.test, df1, df2, SIMPLIFY=FALSE, correct=FALSE)

此处变量l是一个列表。所以,

wilcox.test(df1[,1], df2[,1],  correct=FALSE) 
l[[1]]
wilcox.test(df1[,2], df2[,2],  correct=FALSE) 
l[[2]]

答案 1 :(得分:1)

使用for循环

循环遍历列名称可能更容易
for (name in colnames(DF2)){
    ...
    wilcox.test(DF1[,name], DF2[,name],  correct=FALSE))
    ...
}