【问题标题】:R Error Wilcoxon Test in for loop over columns of data frame: not enough (finite) 'x' observations数据框列的for循环中的R错误Wilcoxon测试:没有足够的(有限)'x'观察
【发布时间】:2018-03-09 19:38:14
【问题描述】:

我有一个暗淡的 15 x 555 行样本数与列蛋白质名称的数据框。该数据框的最后 3 列包含映射信息,即 Treatment、Treatment_Time 和 Month,并被标记为这样。

在循环遍历数据框列时,我希望使用 wilcoxon.test 进行 wilcoxon 测试,并根据映射信息直接从 df 中获取信息。

粗略的例子:

pre_post <- vector()
for(i in names(df[,1:552])){  
    pre_post <- append(pre_post, wilcox.test(df[df$Treatment_Time %in% "Pre", i], df[df$Treatment_Time %in% "Post", i], na.action(na.omit))$p.value))}

期望有一个长度为552的wilcoxon测试p值的向量。如果wilcoxon测试不能按预期完成,我希望输入和“NA”。

此脚本一直有效,直到特定列没有像 Post 这样的数据子集的值,然后传递上述错误。我已经尝试使用关于测试列中数据子集长度的 if else 语句来解决这个问题,但我无法让它工作。

for(i in names(df[,1:552])){
    if(length(df[df$Treatment_Time %in% "Pre", i])>1 & length(df[df$Treatment_Time %in% "Post", i])>1){
        pre_post <- append(pre_post, wilcox.test(df[df$Treatment_Time %in% "Pre", i], df[df$Treatment_Time %in% "Post", i], na.action(na.omit))$p.value)
    }
    else{     
    all_amb_all_delay <- append(all_amb_all_delay, "NA")
    }
}

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。在不存在此类值的情况下,您希望发生什么?
  • 您的代码不会产生任何结果,因为对print() 的隐式调用不会在循环中发生。您需要显式使用 print() 函数或将值添加到向量以保留结果。看看for (i in 1:5) 1 + ifor (i in 1:5) print(1 + i)的区别。如果你使用wilcox.test()的公式方法,你的代码也会更简单。阅读手册页:?Control?wilcox.test

标签: r dataframe statistics


【解决方案1】:

考虑 tryCatch 在具有零行的过滤器上返回 NA,从而导致 wilcox.test 错误。下面使用sapply 在向量中返回 p 个值。

p_value_vector <- sapply(names(df[,1:552]), function(i) 
    tryCatch(
      wilcox.test(df[df$Treatment_Time %in% "Pre", i], 
                  df[df$Treatment_Time %in% "Post", i], 
                  na.action(na.omit))$p.value),
      warning = function(w) return(NA),
      error = function (e) return(NA)
    )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2022-11-01
    • 2023-03-14
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多