【问题标题】:Looping a function over Lists in R在R中的列表上循环函数
【发布时间】:2013-09-26 22:13:28
【问题描述】:

我有一个样本列表,每个样本的长度都不同。我需要比较列表中所有样本的样本均值(使用 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 值向量,以便更广泛的函数可以在必要时重新采样。

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

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

【问题讨论】:

  • sapply 会遍历wilcox.v 的所有元素。 wilcox.v 的每个元素都传递给您的函数并传递给参数i。所以i 将是wilcox.v 的每个连续元素。您似乎已经编写了函数,就好像 i 只是一个整数索引。

标签: r loops lapply


【解决方案1】:

正如 joran 所说,你写的 apply 函数有点不靠谱。有两种方法可以解决这个问题。

  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,] 术语。

【讨论】:

    【解决方案2】:

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

    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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多