如何合并列中的接近值(mz),将 mz 列分组

How to merge the close values (mz) in the column , subgroup the mz column

请问如何合并列中的接近值(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 列进行子组。

谢谢 半

我想你需要这个。在所需序列上创建一个新向量,如 mzaccumulate,除非增加 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-06-09