R中data.frame上的迭代wilcox

时间:2019-03-13 15:29:12

标签: r loops dataframe

我正在尝试或者更希望我可以尝试在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循环,但是对于我来说,我绝对无法在这种情况下对其进行复杂的管理。 非常感谢对像我这样的新手提出的说明含义的任何帮助。

1 个答案:

答案 0 :(得分:0)

apply()就像在矩阵和数组上循环播放一样。在这种情况下,使用margin=1会沿行循环。暂时转换为向量x的每一行都传递给function(x) wilcox.test(x[P], x[D])$p.value,结果是每行一个p值。 PD是逻辑向量,用于指定每个样本中应使用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