咨询:基于条件分组实现指定行取值相减的方法(含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
相关产品推荐
相关产品推荐

