将函数循环到R中的列表

时间:2013-09-26 22:13:28

标签: r loops lapply

我有一个样本列表,每个样本都有不同的长度。我需要比较列表中所有样本的样本均值(使用Mann-Whitney-Wilcoxon检验)。目前的代码如下:

wilcox.v = list() ##This creates the list of samples
for (i in df){
    treat = list(i$treatment)
    wilcox.v = c(wilcox.v,treat)
}
###This *should* iterate over all items in the list
wilcox = sapply(wilcox.v, function(i){ wilcox.test(as.numeric(wilcox.v[i,]), as.numeric(wilcox.v[-i,]), exact = FALSE)$p.value
})

我希望函数返回一个p值向量,以便更广泛的函数可以在必要时重新进行采样。

问题似乎在于需要将样本均值与列表中的所有其他样本均值进行比较。

我确信有一种简单的方法可以做到这一点(我认为它与正确调用指标有关),但我不确定!

2 个答案:

答案 0 :(得分:0)

AS Joran说,你写的应用函数有点难以理解。有两种方法可以解决这个问题。

  1. 修改它以使i实际上是索引引用:

    wilcox = sapply(1:length(wilcox.v)
               ,function(i){ wilcox.test(as.numeric(wilcox.v[[i]])
               ,as.numeric(wilcox.v[[-i]]), exact = FALSE)$p.value
               })
    
  2. 修改您的函数,使其适当地将i视为列表元素。我会将此作为练习留给您(主要是因为我不想处理wilcox.v[-i,]术语。

答案 1 :(得分:0)

感谢您的帮助!这是我最终使用的解决方案。它并不优雅,但它完成了工作。

mannwhit = vector()
for (i in mannwhit.v){
    for (j in mannwhit.v){
        if (identical(i,j) == FALSE){
            p.val = wilcox.test(i, j, paired=FALSE)$p.value
            mannwhit = c(mannwhit, p.val)
        }
    }
}