R for循环计算wilcox.test

Posted

技术标签:

【中文标题】R for循环计算wilcox.test【英文标题】:R for loop to calculate wilcox.test 【发布时间】:2020-07-07 16:37:27 【问题描述】:

我正在尝试编写一个代码来自动计算 Wilcoxon 检验 p 值以进行多次比较。

使用的数据:代表两组参与者的具有相同信息的 2 个数据集完成了相同的 5 个任务,这意味着每个表包含 5 列(任务)和 X 行的任务分数。

data_17_18_G2  # first data set (in data.table format)
data_18_20_G2  # second data set (in data.table format)

两个数据集具有相同的列名称,将在接下来的 W 测试中使用:

wilcox.test(Group1Task1, Group2Task1, paired = F)
wilcox.test(Group1Task2, Group2Task2, paired = F)

等等。 输入(例如 Grou1Task1)是两个任务分数向量(第一个来自 data_17_18_G2,另一个来自 data_18_20_G2

期望的输出:具有一列 p 值的数据表 我面临的问题是,无论我如何操作 val1 和 val2 空对象,在第二行和第三行中,正确的大小“as.numeric(unlist(data_17_18_G2[, ..i]))”都会给出正确的输出(一个数字向量),但它的左边大小“val1 [i]”总是从向量中返回一个值。这让我想到主要问题出现在创建空向量的步骤上,但是我无法解决它。

空对象:

result <- data.table(matrix(ncol=2))
val1 <- as.numeric() # here I also tried functions "numeric" and "vector" 
val2 <- as.numeric()
res <- vector(mode = "list", length = 7)

for循环

for (i in 1:5) 
  val1[i] <- as.numeric(unlist(data_17_18_G2[ , ..i]))  
  val2[i] <- as.numeric(unlist(data_18_20_G2[ , ..i]))
  res[i] <- wilcox.test(val1[i], val2[i], paired = F)
  result[i, 1] <- i
  result[i, 2] <- res$p.value

输出:

Error in `[<-.data.table`(`*tmp*`, i, 2, value = NULL) :
  When deleting columns, i should not be provided

1: В val1[i] <- as.numeric(unlist(data_17_18_G2[, ..i])) :
  number of items to replace is not a multiple of replacement length
2: В val2[i] <- as.numeric(unlist(data_18_20_G2[, ..i])) :
  number of items to replace is not a multiple of replacement length
3: В res[i] <- wilcox.test(val1[i], val2[i], paired = F) :
  number of items to replace is not a multiple of replacement length

替代方案: 我改了第二行和第三行

for (i in 1:5) 
  val1[i] <- as.numeric(data_17_18_G2[ , ..i])
  val2[i] <- as.numeric(data_18_20_G2[ , ..i])
  res[i] <- wilcox.test(val1[i], val2[i], paired = F)
  result[i, 1] <- i
  result[i, 2] <- res$p.value

得到了这个

Error in as.numeric(data_17_18_G2[, ..i]) :
(list) object cannot be coerced to type 'double'

这意味着函数 wilcox.test 无法解释这种类型的输入。

如何改进代码以获得 p 值数据表?

【问题讨论】:

能否请您发布您的数据样本(使用dput())?很难说这里发生了什么。 【参考方案1】:

代码中似乎存在一些错误。我以汽车数据集为例重写了代码。

## use the cars dataset as a example (change with appropriate data)
data(cars)

data_17_18_G2  <- as.data.table(cars)
data_18_20_G2  <- data_17_18_G2[,2:1]

## Fixed code

result <- data.table(matrix(as.numeric(), nrow=ncol(data_17_18_G2), ncol=2))
val1 <- as.numeric() 
val2 <- as.numeric()
res <- vector(mode = "list", length = 7)

for (i in 1:ncol(data_17_18_G2)) 
  val1 <- as.numeric(unlist(data_17_18_G2[ , ..i]))  
  val2 <- as.numeric(unlist(data_18_20_G2[ , ..i]))
  res[[i]] <- wilcox.test(val1, val2, paired = F)
  result[i, 1] <- as.numeric(i)
  result[i, 2] <- as.numeric(res[[i]]$p.value)

希望这能给你你所追求的输出。

【讨论】:

谢谢!您的解决方案对我帮助很大。它仍然不喜欢“结果”的框架,所以我将其更改为 data.frame result &lt;- data.frame(matrix(ncol = 2)),其余的都很好!

以上是关于R for循环计算wilcox.test的主要内容,如果未能解决你的问题,请参考以下文章

R提高嵌套for()循环的效率,以在大型数据集中进行简单的距离计算

让 r 中的 for 循环跳过一些值

R中的for循环与while循环

如何加速R中的循环计算循环

使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环

如何在R语言中用apply等函数替代for循环