R语言批量生成同名前缀多列的0-12月变量差值
批量生成重复测量变量的差值列
针对你拥有的多变量重复测量宽表,以下是用lapply和Reduce批量计算每个变量12月与0月差值的解决方案:
步骤1:提取需要计算差值的变量前缀
首先从宽表列名中提取所有测量变量的前缀(如SBP、BMI):
# 筛选出非id、非group的列,提取前缀并去重 vars <- unique(sub("_\\d+$", "", setdiff(colnames(df1), c("id", "group"))))
步骤2:批量生成差值列
用lapply遍历每个变量前缀,生成包含id和对应差值列的小数据框:
library(dplyr) library(tidyr) diff_cols <- lapply(vars, function(var) { df1 %>% # 只保留当前变量的各时间点列和id select(id, starts_with(var)) %>% # 计算12月减0月的差值,列名格式为[变量名]_diff mutate(!!paste0(var, "_diff") := .data[[paste0(var, "_12")]] - .data[[paste0(var, "_0")]]) %>% # 只保留id和差值列 select(id, ends_with("_diff")) })
步骤3:合并差值列到原宽表
用Reduce结合left_join,将所有差值列合并到原数据中:
df_final <- Reduce(function(x, y) left_join(x, y, by = "id"), c(list(df1), diff_cols))
验证结果
查看最终数据框,会自动生成所有变量的差值列:
print(df_final)
输出结果与你预期的格式一致,且无需手动逐个处理变量,适合变量数量众多的场景。
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

