R for循环计算wilcox.test

R for loop to calculate wilcox.test

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

使用的数据:2 个具有相同信息的数据集代表两组参与者完成了相同的 5 个任务,这意味着每个 table 包含 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

所需输出:数据 table 包含一列 p 值 我面临的问题是,无论我如何操作 val1 和 val2 空对象,在第二行和第三行中,正确的大小 "as.numeric(unlist(data_17_18_G2[, ..i]))" 给出了正确的输出(数字向量),但它的大小为左 "val1[i]" 总是 returns 向量中只有一个值。这让我想到主要问题出现在创建空向量的步骤上,但是,我无法解决它。

空对象:

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 值数据 table?

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

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

希望这能为您提供所需的输出。