我正在尝试或者更希望我可以尝试在R中编写一个循环,该循环以迭代方式执行Wilcoxon测试(wilcox.test),比较data.frame每行中的两组值,并为每一行返回p值,然后将p值及其关联的行标签放入数据框。 data.frame如下:
> tab[1:5,]
mol E12 E15 E22 E25 E26 E27 E38 E44 E47
1 A 7362.40 2475.93 3886.06 5825.59 6882.00 3250.05 3406.65 6416.29 7786.73
2 B 5391.42 2037.88 3330.05 4043.83 5766.20 2591.69 3603.95 14431.89 8320.70
3 C 1195.89 241.24 252.46 865.97 1970.28 899.22 346.36 1135.86 1179.31
4 D 502.64 171.41 434.29 508.22 419.34 260.13 298.14 326.70 167.07
5 E 181.63 171.41 165.30 150.47 164.09 109.19 122.76 212.74 155.60
列标记为:mol,所评估的特定分子(约20); E12至E47为测量每个分子的值的样品。
要比较的组是:
P;样本E12,E25,E26,E27,E44。 D;样本E15,E22,E38,E47。
输出应如下所示:
mol p-value
A 1
B 0.5556
C 0.9048
etc.
我尝试使用for in循环,但是对于我来说,我绝对无法在这种情况下对其进行复杂的管理。 非常感谢对像我这样的新手提出的说明含义的任何帮助。
答案 0 :(得分:0)
apply()
就像在矩阵和数组上循环播放一样。在这种情况下,使用margin=1
会沿行循环。暂时转换为向量x
的每一行都传递给function(x) wilcox.test(x[P], x[D])$p.value
,结果是每行一个p值。 P
和D
是逻辑向量,用于指定每个样本中应使用x
中的哪些元素。
tab0 <- read.table(text="mol E12 E15 E22 E25 E26 E27 E38 E44 E47
A 7362.40 2475.93 3886.06 5825.59 6882.00 3250.05 3406.65 6416.29 7786.73
B 5391.42 2037.88 3330.05 4043.83 5766.20 2591.69 3603.95 14431.89 8320.70
C 1195.89 241.24 252.46 865.97 1970.28 899.22 346.36 1135.86 1179.31
D 502.64 171.41 434.29 508.22 419.34 260.13 298.14 326.70 167.07
E 181.63 171.41 165.30 150.47 164.09 109.19 122.76 212.74 155.60",
header=TRUE)
tab <- as.matrix(tab0[,-1])
P <- colnames(tab) %in% c("E12", "E25", "E26", "E27", "E44")
D <- colnames(tab) %in% c("E15", "E22", "E38", "E47")
pv <- apply(tab, 1, function(x) wilcox.test(x[P], x[D])$p.value)
data.frame(tab0[1], p.val=signif(pv, 4))
# mol p.val
# 1 A 0.5556
# 2 B 0.4127
# 3 C 0.1111
# 4 D 0.1905
# 5 E 0.9048