首页 > 解决方案 > 如何合并列中的关闭值(mz),对 mz 列进行分组

问题描述

我请求如何合并列中的关闭值(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 列进行子组。

谢谢半

标签: rdplyrmergecumsum

解决方案


我想你需要这个。在所需序列上创建一个新向量,例如mzthroughaccumulate它不会替换值,除非增加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 包于 2021-06-09 创建 (v2.0.0 )


推荐阅读