3

我有两个 data.frames 看起来像:

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 ,特别是在成对的列之间,这样:

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

4

2 回答 2

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]]
于 2013-03-11T14:48:20.637 回答
1

使用 for 循环来循环列名可能更容易

for (name in colnames(DF2)){
    ...
    wilcox.test(DF1[,name], DF2[,name],  correct=FALSE))
    ...
}
于 2013-03-11T14:50:03.383 回答