r-两次拆分数据帧并基于列进行合并



我有一个带有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

使用数据表:

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

您不应该将列命名为"mean",因为mean是一个函数,可能会出现混淆。

使用dplyr包可以轻松做到这一点

output <- input_data %>%
           group_by(sample_ID,chrom) %>%
           order(start.pos,end.pos) %>%
           summarize(Mean = mean(mean))

如果这对您没有帮助,请尝试提供一个可复制的示例。

最新更新