问题描述
我请求如何合并列中的接近值(mz)(差异小于20),对mz列进行分组,然后计算平均值?例如。
mz1 <- c(seq(100,190,by = 10))
rt1 <- c(seq(1,10,by = 1))
value1 <- runif(10,min = 100,max = 100000)
df1 <- as.data.frame(cbind(mz1,rt1,value1))
我想得到如下结果:
raw data
1 100 1 14365.72
2 110 2 41513.18
3 120 3 41431.06
4 130 4 36947.66
5 140 5 15329.23
6 150 6 13966.73
7 160 7 23380.11
8 170 8 46649.65
9 180 9 26670.67
10 190 10 85796.99
output
1 100 1 14365.72
2 110 1 41513.18
3 120 1 41431.06
4 130 2 36947.66
5 140 2 15329.23
6 150 2 13966.73
7 160 3 23380.11
8 170 3 46649.65
9 180 3 26670.67
10 190 4 85796.99
我可以使用分组信息来计算平均值,但我不知道如何根据截止值(20 或其他)对 mz 列进行分组。
谢谢 半
解决方法
我认为你需要这个。在所需序列上创建一个新向量,例如 mz
到 accumulate
,除非增加 N
,否则不会替换该值。此后使用了 dense_rank
。如果您可能会得到重复值,您可以安全地使用 data.table::rleid
而不是 dense_rank
。
set.seed(123)
mz1 <- c(seq(100,190,by = 10))
rt1 <- c(seq(1,10,by = 1))
value1 <- runif(10,min = 100,max = 100000)
df1 <- as.data.frame(cbind(mz1,rt1,value1))
library(tidyverse)
N <- 20
df1 %>%
mutate(sub_grp = dense_rank(accumulate(mz1,~if(abs(.x - .y) > N) {.y} else .x)))
#> mz1 rt1 value1 sub_grp
#> 1 100 1 28828.994 1
#> 2 110 2 78851.683 1
#> 3 120 3 40956.794 1
#> 4 130 4 88313.439 2
#> 5 140 5 94052.682 2
#> 6 150 6 4651.094 2
#> 7 160 7 52857.738 3
#> 8 170 8 89252.663 3
#> 9 180 9 55188.358 3
#> 10 190 10 45715.812 4
由 reprex package (v2.0.0) 于 2021 年 6 月 9 日创建