将数据帧拆分两次并根据列进行合并

时间:2014-10-28 10:51:29

标签: r merge split dataframe

我有一个带有sampleID,染色体,开始和停止以及平均分数的数据框。我希望将每个chrom中每个sampleID的平均分数与所有sampleID中start.pos和end.pos的所有可能组合相结合。因此,要为每条染色体合并所有可能的start.pos和end.pos,并为所有sampleID添加每个组合的$ mean得分。

输入:

      sampleID     chrom start.pos  end.pos  meancol
1.1   0012102_A01     1         0  11194349    1
1.4   0012102_A01     1  11194349  11492125    0
1.5   0012102_A01     1  11492125  71442329    1
1.9   0012102_A01     1  71442329 249250621    1
1.13  0012102_A02     1         0  65493011    1
1.92  0012102_A02     1  65493011  66164733    1
1.102 0012102_A02     1  66164733 121347754    1
1.52  0012102_A02     1 121347754 249250621    0
1.14  0012102_A03     1         0  56384956    1
1.83  0012102_A03     1  56384956 106266297    1
1.73  0012102_A03     1 106266297 249250621    0
1.15  0012102_A04     1         0  51484139    1
1.27  0012102_A04     1  51484139 249250621    0
2.1   0012102_A01     2         0  50000001    1
2.2   0012102_A01     2  50000001 250000001    1
2.3   0012102_A02     2         0  50000001    0
2.7   0012102_A02     2  50000020 270000001    0
2.18  0012102_A03     2         0  50000004    0
2.19  0012102_A03     2  50000004 250000001    0
1.15  0012102_A04     2         0  51484139    0
1.27  0012102_A04     2  51484139 249250621    0

输出:此处为每个染色体的所有可能的start.pos和end.pos组合添加了每个sampleID的所有平均分数。

chrom start.pos   end.pos meancol
1          0  11194349    4
1   11194349  11492125    3
1   11492125  51484139    4
1   51484139  56384956    3
1   56384956  65493011    3
1   65493011  66164733    1
1   66164733  71442329    3
1   71442329 106266297    2
1  106266297 121347754    1
1  121347754 249250621    1
2          0  50000001    1
2   50000001  50000004    0
2   50000004  50000020    0
2   50000004  51484139    0
2   51484139 249250621    0
2  249250621 250000001    0

2 个答案:

答案 0 :(得分:1)

使用data.table:

library(data.table)
setDT(mydataframe)[order(start.pos,end.pos),list(summean=sum(meancol)),by=list(sampleID, chrom)]

你不应该将列命名为'mean',因为mean是一个函数,可能会有混淆。

答案 1 :(得分:-1)

您可以使用dplyr

轻松完成此操作
output <- input_data %>%
           group_by(sample_ID,chrom) %>%
           order(start.pos,end.pos) %>%
           summarize(Mean = mean(mean))

如果这对您没有帮助,请尝试提供可重现的示例。