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.frameresult <- data.frame(matrix(ncol = 2))
,其余的都很好!以上是关于R for循环计算wilcox.test的主要内容,如果未能解决你的问题,请参考以下文章
R提高嵌套for()循环的效率,以在大型数据集中进行简单的距离计算