如何基于chrom、start、end列条件计算Mmet.diff均值并生成新DataFrame
问题
需要对DataFrame的3列设置条件,实现以下操作:
- 当
chrom、start、end列的连续行内容完全相同时,计算这些行对应Mmet.diff列的均值 - 将满足条件的重复行合并为一行,同时保留原数据中不满足条件的行
- 最终将所有结果存入新的DataFrame
原始数据示例:
print(TestDMR3sam, n=30) # A tibble: 568 × 4 chrom start end Mmet.diff <chr> <int> <int> <dbl> 1 chr1 2017424 2017750 0.170 2 chr1 2019883 2020173 0.281 3 chr1 3899411 3899468 -0.316 4 chr1 4654862 4655147 0.158 5 chr1 4710490 4710875 -0.250 6 chr1 4710490 4710875 -0.233 7 chr1 16535549 16535834 0.293 8 chr1 24901325 24901700 0.163 9 chr1 24902268 24902701 0.105 10 chr1 24927215 24927416 0.176 11 chr1 24965375 24965581 0.224 12 chr1 26861926 26862173 0.120 13 chr1 26864186 26864613 -0.158 14 chr1 35574331 35574705 0.119 15 chr1 35576334 35576451 -0.301 16 chr1 36304606 36304817 -0.238 17 chr1 36305874 36305982 0.145 18 chr1 37732310 37732512 0.185 19 chr1 37766791 37766870 -0.185 20 chr1 44632491 44632732 0.178 21 chr1 44632877 44632946 0.0786 22 chr1 46506789 46506876 0.148 23 chr1 47227823 47228049 0.209 24 chr1 50103848 50103979 0.155 25 chr1 67232241 67232364 0.119 26 chr1 81801772 81802167 0.267 27 chr1 90852089 90852325 -0.257 28 chr1 109711736 109712104 0.428 29 chr1 109712501 109712939 0.365 30 chr1 109714072 109714219 0.133 # ℹ 538 more rows # ℹ Use `print(n = ...)` to see more rows
例如第5、6行的chrom、start、end列内容相同,需计算Mmet.diff列的均值(-0.250-0.233)/2=-0.2415,并将这两行合并为一行,预期输出DataFrame如下:
chrom start end Mmet.diff <chr> <int> <int> <dbl> 1 chr1 2017424 2017750 0.170 2 chr1 2019883 2020173 0.281 3 chr1 3899411 3899468 -0.316 4 chr1 4654862 4655147 0.158 6 chr1 4710490 4710875 -0.2415 7 chr1 16535549 16535834 0.293 8 chr1 24901325 24901700 0.163 9 chr1 24902268 24902701 0.105 10 chr1 24927215 24927416 0.176 11 chr1 24965375 24965581 0.224 12 chr1 26861926 26862173 0.120 13 chr1 26864186 26864613 -0.158 14 chr1 35574331 35574705 0.119 15 chr1 35576334 35576451 -0.301 16 chr1 36304606 36304817 -0.238 17 chr1 36305874 36305982 0.145 18 chr1 37732310 37732512 0.185 19 chr1 37766791 37766870 -0.185 20 chr1 44632491 44632732 0.178 21 chr1 44632877 44632946 0.0786 22 chr1 46506789 46506876 0.148 23 chr1 47227823 47228049 0.209 24 chr1 50103848 50103979 0.155 25 chr1 67232241 67232364 0.119 26 chr1 81801772 81802167 0.267 27 chr1 90852089 90852325 -0.257 28 chr1 109711736 109712104 0.428 29 chr1 109712501 109712939 0.365 30 chr1 109714072 109714219 0.133
解决方案
方法1:合并所有相同行(含非连续)
如果不需要区分连续/非连续,只要chrom、start、end相同就合并,直接用分组聚合:
library(dplyr) new_df <- TestDMR3sam %>% group_by(chrom, start, end) %>% summarise(Mmet.diff = mean(Mmet.diff), .groups = "drop")
group_by(chrom, start, end):按三列分组,所有相同行归为一组summarise:计算每组Mmet.diff的均值.groups = "drop":取消分组,返回普通tibble
方法2:仅合并连续相同行
如果只需要合并连续的相同行,非连续的相同行保留原样,需先创建连续分组标识:
library(dplyr) new_df <- TestDMR3sam %>% # 生成连续分组ID:当当前行与上一行三列不同时,分组号+1 mutate(group_id = cumsum(!(chrom == lag(chrom, default = "") & start == lag(start, default = -1) & end == lag(end, default = -1)))) %>% group_by(group_id) %>% summarise(chrom = first(chrom), start = first(start), end = first(end), Mmet.diff = mean(Mmet.diff)) %>% select(-group_id) # 移除临时分组列
mutate(group_id = cumsum(...)):通过行与行的比较,标记连续相同行的分组group_by(group_id):按连续分组聚合summarise:提取分组内的三列值(组内均相同),并计算均值
内容的提问来源于stack exchange,提问作者Debajyoti Kabiraj
相关产品推荐
相关产品推荐

