微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何合并列中的接近值 (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 列进行分组。

谢谢 半

解决方法

我认为你需要这个。在所需序列上创建一个新向量,例如 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 年 6 月 9 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。