1

在我的代码中,我得到了一个看起来很像这样的表列表:

[[1]]
     cluster_size start end number       p_value
13             2    12  13    131 4.209645e-233
12             1    12  12    100 6.166824e-185
22            11    12  22    132 6.916323e-143
23            12    12  23    133 1.176194e-139
13             1    13  13     31  3.464284e-38
13            68    13 117     34  3.275941e-37
23            78    23 117      2  4.503111e-32

……

[[2]]
      cluster_size start end number       p_value
13             2    12  13    131 4.209645e-233
12             1    12  12    100 6.166824e-185
22            11    12  22    132 6.916323e-143
23            12    12  23    133 1.176194e-139
13             1    13  13     31  3.464284e-38

……

虽然我没有在这里展示完整的表格,但我知道它们的大小都一样。我想要做的是制作一张表格,在其中将 p 值相加。问题是当我查看不同列表元素中的表格时,$cluster_size、start、$end 和 $number 列不一定对应于同一行,所以我不能只做一个简单的求和。

执行此操作的蛮力方法是:1)制作一个空白表 2)从第一个表中复制适当的 $cluster_size、$start、$end、$number 列,并使用 which() 提取正确的 p 值所有表中的语句。有没有更聪明的方法来做到这一点?或者这差不多吗?

编辑:我被要求提供数据的 dput 文件。它位于此处: http ://alrig.com/code/

在示例情况下,行的顺序恰好匹配。情况并非总是如此。

4

1 回答 1

3

似乎您可以分两步执行此操作

  1. 将您的列表转换为 data.frame
  2. 使用任何拆分-应用-组合方法进行总结。

假设您的数据名为 X,您可以执行以下操作:

library(plyr)
#need to convert to data.frame since all of your list objects are of class matrix
XDF <- as.data.frame(do.call("rbind", X))
ddply(XDF, .(cluster_size, start, end, number), summarize, sump = sum(p_value))
#-----
   cluster_size start end number          sump
1             1    12  12    100 5.550142e-184
2             1    13  13     31  3.117856e-37
3             1    22  22      1  9.000000e+00
...
29          105    23 117      2  6.271469e-16
30          106    22 146     13  7.266746e-25
31          107    23 146     12  1.382328e-25

此处介绍了许多其他聚合技术。data.table如果您的数据很大,我会查看包。

于 2012-09-15T04:35:08.773 回答