如何对两个数据帧之间的列进行Wilcoxon测试

时间:2017-10-09 22:33:37

标签: r dataframe comparison

我有两个数据帧:

D9 <- as.data.frame(DF$As,DF$Cd,DF$Cu,DF$Cr,DF$Ni,DF$Pb,DF$Zn)
D10 <- as.data.frame(DO$As,DO$Cd,DO$Cu,DO$Cr,DO$Ni,DO$Pb,DO$Zn)

并希望对每列(DF $ As,DO $ As)等应用wilcox测试。 我尝试了以下代码:

lapply(ncol(D9), function(i) {wilcox.test((D9[,i]),(D10[,i]))})

输出结果为:

[[1]]
Wilcoxon rank sum test
data:  (D9[, i]) and (D10[, i])
W = 107, p-value = 0.9834
alternative hypothesis: true location shift is not equal to 0

所以我的问题是 - 我做错了什么?任何帮助表示赞赏。

先谢谢。

4 个答案:

答案 0 :(得分:2)

我们有两个不同的数据框 d1 &amp; d N 分别对 X 变量和 N 观察 Y 变量进行观察。
为了在这两个不同数据帧的每一列之间找到Wilcoxon-Matt-Whitney检验 d1 &amp;的 D2
1。阅读数据:

d1 <- data.frame(read.table("data1", header = TRUE, stringsAsFactors = FALSE, sep = ""))
d2 <- data.frame(read.table("data2", header = TRUE, stringsAsFactors = FALSE, sep = ""))

假设 d1 中的列数大于 d2

中的列数
length(colnames(d1)) >= length(colnames(d2))  

2. 声明矩阵存储p值

pvalue <- matrix(nrow = length(colnames(d2)), ncol = (length(colnames(d1)))  

3. 现在,对于 d2 $ 1 的每一栏进行Wilcoxon-Matt-Whitney测试, d1 $ 1,d1 $ 2,d1 $ 3,... < / strong>等等

for(i in 1:length(colnames(d2))){
  for(j in 1:length(colnames(d1))){
    pvalue[i,j]<-wilcox.test(d2[,i], d1[,j], paired=TRUE)$p.value 
    colnames(pvalue) <- colnames(d1)
    rownames(pvalue) <- colnames(d2)} }  

注意:如果我们想在单个数据帧上执行Wilcoxon-Matt-Whitney测试以找到一列与相同数据帧的另一列之间的关系,则此方法也可以正常工作。

d3 <- data.frame(read.table("data3", header = TRUE, stringsAsFactors = FALSE, sep = ""))  
pvalue <- matrix(nrow = length(colnames(d3)), ncol = (length(colnames(d3)))

现在为Wilcoxon-Matt-Whitney测试每列 d3 $ 1 d3 $ 1,d3 $ 2,d3 $ 3,... 等等

for(i in 1:length(colnames(d3))){
  for(j in 1:length(colnames(d3))){
    pvalue[i,j]<-wilcox.test(d3[,i], d3[,j], paired=TRUE)$p.value 
    colnames(pvalue) <- colnames(d3)
    rownames(pvalue) <- colnames(d3)} }

答案 1 :(得分:1)

请注意,ncol(D9)只会返回一个数字,因此lapply只会迭代该单个数字。使用1:ncol(D9)从第一列开始(或使用seq.int(ncol(D9))。查看lapply(9, print)lapply(1:9, print)之间的差异

备选方案,您可以直接使用

映射列
Map(wilcox.test, D9, D10)

因为data.frames实际上只是列表。

答案 2 :(得分:0)

lapply需要一个向量,所以@ MrFlick的建议可能会有所帮助(你实际上只进行了一次wilcox测试)

您还可以通过循环获得迭代打印输出

for(i in 1:ncol(D9)){
    summary(wilcox.text(D9[,i],D10[,i]))
}

答案 3 :(得分:0)

这是使用软件包的替代方法,在虹膜的第1-2列和第3-4列之间进行wilcox测试。

library(matrixTests)
col_wilcoxon_twosample(iris[,1:2], iris[,3:4])

             obs.x obs.y obs.tot statistic       pvalue alternative location.null exact corrected
Sepal.Length   150   150     300     19249 1.702530e-26   two.sided             0 FALSE      TRUE
Sepal.Width    150   150     300     22362 1.295486e-49   two.sided             0 FALSE      TRUE