R中按列分组后在函数内计算气体相对浓度的代码实现
分组计算气体相对浓度的R代码实现方案
核心计算逻辑
严格匹配你提出的计算规则:
- 拆分独立实验维度:按
source(o/n)、activty(low/high)的组合切分实验组,每个组合内的计算完全独立 - 组内基准计算:对每个实验组下
sampling == "blank"的所有空白罐,计算x、y浓度的算术平均值,作为该组的空白基准浓度 - 相对浓度计算:组内空白基准浓度 / 同组下每一条记录的x、y浓度,得到最终的相对浓度值,计算结果与你给出的
x_pct、y_pct示例完全一致
方案1:dplyr向量化计算(最常用、可读性高)
这是R中日常数据处理最常用的实现方式,全流程无循环,向量化操作效率高,适配绝大多数数据规模:
library(dplyr) df_result <- df %>% # 按实验条件分组 group_by(source, activty) %>% mutate( # 计算当前组的空白平均浓度 blank_avg_x = mean(x[sampling == "blank"]), blank_avg_y = mean(y[sampling == "blank"]), # 计算相对浓度,保留两位小数与示例精度匹配 calc_x_pct = round(blank_avg_x / x, 2), calc_y_pct = round(blank_avg_y / y, 2) ) %>% ungroup()
方案2:data.table极速计算(适配大样本数据)
如果后续数据量达到十万行级别,data.table的内存效率和运行速度优势明显,代码更简洁:
library(data.table) setDT(df) df_result <- df[, `:=`( calc_x_pct = round(mean(x[sampling == "blank"]) / x, 2), calc_y_pct = round(mean(y[sampling == "blank"]) / y, 2) ), by = .(source, activty) # 按实验维度分组计算 ]
结果验证说明
以source = "o"、activty = "low"实验组为例:
- 该组两个空白罐的x浓度分别为34、34,均值为34;两个空白罐的y浓度分别为46、45,均值为45.5
- 对应土壤罐的计算值:
- jar1:x=21 → 34/21≈1.62,y=33 →45.5/33≈1.38,与示例的
x_pct、y_pct完全匹配 - jar4:x=19 →34/19≈1.79,y=34 →45.5/34≈1.34,与示例值完全一致
- jar1:x=21 → 34/21≈1.62,y=33 →45.5/33≈1.38,与示例的
- 计算得到的相对浓度值可直接用于表征土壤吸收强度:数值越高,代表土壤罐内剩余气体浓度越低,土壤对该气体的吸收量越大
内容的提问来源于stack exchange,提问作者Tiptop
相关产品推荐
相关产品推荐

