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

按日期与阀门分组计算数据框中Drip与Drain样本水质指标差值的实现咨询

按日期与阀门分组计算数据框中Drip与Drain样本水质指标差值的实现咨询

嘿,这个问题其实分组之后就差最后一步啦!核心就是把每组里的Drip样本值和Drain样本值对应上,直接做减法就行。我给你两种常用的R实现思路,都是基于tidyverse工具包的,你可以按需选择:

方法一:宽表转换法(直观易核对)

这种方法先把数据从长表转成宽表,让每组的Drip和Drain值放在同一行,直接做列间减法,最后还能转回长表方便后续分析:

library(tidyverse)

# 你的原始数据
df <- structure(list(Date = structure(c(20095, 20095, 20095, 20095, 20123, 20123, 20123, 20123), class = "Date"), 
                     Type = c("Drip", "Drain", "Drip", "Drain", "Drip", "Drain", "Drip", "Drain"), 
                     Valve = c(73, 73, 74, 74, 73, 73, 74, 74), 
                     `Nitrate_N_(ppm)` = c(26.5, 17.5, 21.9, 16.2, 30.1, 47.9, 29.1, 63.8), 
                     `Ammonium_N_(ppm)` = c(36, 49, 39, 51, 29, 109, 36, 99), 
                     `Calcium_(ppm)` = c(22, 32.5, 18, 31.2, 24.2, 81.7, 22.4, 78.7)), 
                row.names = c(NA, -8L ), 
                class = c("tbl_df", "tbl", "data.frame"))

# 1. 转宽表:每组的Drip和Drain值同行
wide_df <- df %>%
  pivot_wider(
    id_cols = c(Date, Valve),
    names_from = Type,
    values_from = c(`Nitrate_N_(ppm)`, `Ammonium_N_(ppm)`, `Calcium_(ppm)`),
    names_sep = "_"
  )

# 2. 计算Drip减Drain的差值
wide_df_with_diff <- wide_df %>%
  mutate(
    `Nitrate_N_(ppm)_diff` = `Nitrate_N_(ppm)_Drip` - `Nitrate_N_(ppm)_Drain`,
    `Ammonium_N_(ppm)_diff` = `Ammonium_N_(ppm)_Drip` - `Ammonium_N_(ppm)_Drain`,
    `Calcium_(ppm)_diff` = `Calcium_(ppm)_Drip` - `Calcium_(ppm)_Drain`
  )

# 3. 可选:转回长表格式(适合后续可视化或批量分析)
long_result <- wide_df_with_diff %>%
  pivot_longer(
    cols = ends_with("_diff"),
    names_to = "Indicator",
    values_to = "Drip_Minus_Drain",
    names_transform = ~str_remove(., "_diff")
  )

这种方法的好处是中间的宽表能同时保留原始的Drip和Drain值,方便你核对计算结果是否正确,比如你提到的阀门73在2025-07-01的Calcium差值:22 - 32.5 = -10.5,在宽表里一眼就能验证。

方法二:分组直接计算(更简洁高效)

如果不需要保留原始的Drip/Drain值,只想直接得到差值,这种方法更高效——分组后直接用逻辑索引提取对应的值做减法:

diff_result <- df %>%
  group_by(Date, Valve) %>%
  summarise(
    `Nitrate_N_(ppm)_diff` = `Nitrate_N_(ppm)`[Type == "Drip"] - `Nitrate_N_(ppm)`[Type == "Drain"],
    `Ammonium_N_(ppm)_diff` = `Ammonium_N_(ppm)`[Type == "Drip"] - `Ammonium_N_(ppm)`[Type == "Drain"],
    `Calcium_(ppm)_diff` = `Calcium_(ppm)`[Type == "Drip"] - `Calcium_(ppm)`[Type == "Drain"],
    .groups = "drop" # 计算完成后取消分组,返回普通数据框
  )

这个逻辑很简单:每个Date+Valve组里只有两个观测(Drip和Drain),用Type == "Drip"就能精准定位到该组的Drip值,同理定位Drain值,直接相减即可。

两种方法都能得到你需要的结果,你可以根据自己的需求选择~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:03:03