如何优雅计算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
相关产品推荐
相关产品推荐

