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

咨询:基于条件分组实现指定行取值相减的方法(含data.table)

在分组数据中计算扣除空白值的浓度

现有数据集

Variable          Range     Avg.Concentration
1          m21.021 (H[1]3O[16]1) blank          0.000000
2          m21.021 (H[1]3O[16]1)  dms1          0.000000
3          m21.021 (H[1]3O[16]1)  dms2          0.000000
4          m21.021 (H[1]3O[16]1)  dms3          0.000000
5          m21.021 (H[1]3O[16]1)  dms4          0.000000
6          m33.993 (O[16]2H[1]1) blank          0.103741
7          m33.993 (O[16]2H[1]1)  dms1          0.107979
8          m33.993 (O[16]2H[1]1)  dms2          0.108123
9          m33.993 (O[16]2H[1]1)  dms3          0.104491
10         m33.993 (O[16]2H[1]1)  dms4          0.104051
11         m39.032 (H[1]5O[16]2) blank          1.391382
12         m39.032 (H[1]5O[16]2)  dms1          1.025274
13         m39.032 (H[1]5O[16]2)  dms2          1.007375
14         m39.032 (H[1]5O[16]2)  dms3          1.068320
15         m39.032 (H[1]5O[16]2)  dms4          1.154035

需求说明

需要按Variable分组,新增一列Calculated Concentration:

  • 对于每组中的dms1/dms2/dms3/dms4行,取值为当前行的Avg.Concentration减去同组内blank行的Avg.Concentration
  • 示例:Variable为m33的7-10行计算结果如下:
    • 第7行:0.107979 - 0.103741
    • 第8行:0.108123 - 0.103741
    • 第9行:0.104491 - 0.103741
    • 第10行:0.104051 - 0.103741
  • 每个Variable对应的blank值不同,无法用固定常量计算

过往实现(仅含blank和dms两组时)

当Range只有blank和dms两个选项时,可通过data.table的shift函数实现:

旧数据集

Variable          Range     Avg.Concentration
1          m21.021 (H[1]3O[16]1)  blank         0.000000
2          m21.021 (H[1]3O[16]1)  dms           0.000000
3          m33.993 (O[16]2H[1]1)  blank         0.103741
4          m33.993 (O[16]2H[1]1)  dms           0.107979
5         m39.032 (H[1]5O[16]2)   blank         1.391382
6         m39.032 (H[1]5O[16]2)   dms           1.025274

实现代码

# calculate concentration (average - blank)
df[, Cal.Concentration := Avg.Concentration - shift(Avg.Concentration, fill = first(Avg.Concentration))]

理想实现思路

希望编写逻辑:

  • 若Range == "dms1",则减去上一行的Avg.Concentration
  • 若Range == "dms2",则减去前两行的Avg.Concentration
  • 若Range == "dms3",则减去前三行的Avg.Concentration
  • 若Range == "dms4",则减去前四行的Avg.Concentration

不局限于data.table,接受其他工具方案。目前临时方法是新增blank列存储每组的空白值再做数组相减,但该方法耗时较长。


内容的提问来源于stack exchange,提问作者jamskell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:26