You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:39:51