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

如何优雅计算data.frame/tibble中变量的t2-t1差值?

简便实现方法

这里提供几种简洁的实现思路,替代不够优雅的group_by()+lag()操作:

方法1:拆分列名后转宽计算(推荐)

先拆分name列得到变量名和时间点,再转成宽格式直接计算t2-t1的差值,逻辑清晰且代码简洁:

library(tidyverse)

df %>%
  # 拆分name列为变量名(var)和时间点(time)
  separate(name, into = c("var", "time"), sep = "_t") %>%
  # 转宽格式,将t1/t2作为列
  pivot_wider(names_from = time, values_from = value) %>%
  # 计算t2减t1的差值
  mutate(diff = `2` - `1`) %>%
  # 保留需要的结果列
  select(var, diff)

方法2:长格式分组直接计算

如果想保留长格式操作逻辑,拆分列后直接通过时间点筛选计算,比lag()更直观:

df %>%
  separate(name, into = c("var", "time"), sep = "_t") %>%
  group_by(var) %>%
  summarise(diff = value[time == "2"] - value[time == "1"])

额外优化:从宽格式直接计算(更高效)

如果还未执行pivot_longer,建议先在宽格式下生成差值列再转长,这是最高效的流程:

# 基于原始宽格式df_wide操作
df_wide %>%
  mutate(across(ends_with("_t1"), 
                ~ get(str_replace(cur_column(), "_t1", "_t2")) - .,
                .names = "{str_remove(.col, '_t1')}_diff")) %>%
  pivot_longer(cols = ends_with(c("_t1", "_t2", "_diff")))

内容的提问来源于stack exchange,提问作者D. Studer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:45:56