【问题标题】:iterative wilcox on data.frame in RR中data.frame的迭代wilcox
【发布时间】:2019-03-13 15:29:11
【问题描述】:

我正在尝试,或者更确切地说,我希望我可以尝试,在 R 中编写一个循环,以迭代方式执行 Wilcoxon 测试 (wilcox.test),比较 data.frame 每一行中的两组值,并为每一行返回 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 是测量每个分子值的样品。 要比较的组是: 磷;样品 E12、E25、E26、E27、E44。 D;样品 E15、E22、E38、E47。 输出应如下所示:

mol p-value
A   1
B   0.5556
C   0.9048
etc.    

我尝试使用 for in 循环,但我绝对无法在这个复杂的上下文中管理它。 对于像我这样的新手来说,对 cme​​ts 的任何帮助都非常感谢。

【问题讨论】:

    标签: r loops dataframe


    【解决方案1】:

    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
    

    【讨论】:

    • 我刚刚尝试过,效果很好,但是,通过快速检查,报告的 p 值结果移动了 1 行:按行 A 报告的结果似乎是那些对于 B 行中的值。对此有任何提示吗?再次感谢您。
    • 很好奇。如果我做wilcox.test(tab[1, P], tab[1, D])$p.value,我得到0.5556,这与apply()的结果一致。
    • 我的错,我弄乱了标签。奇迹般有效!谢谢,很抱歉因为我的无知而打扰你
    • 没问题。如果某个答案被认为有帮助,我们鼓励您点击其左上角附近的绿色对勾标记accept
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-04-30
    • 2018-05-06
    相关资源
    最近更新 更多