R语言使用dplyr按列名模式匹配批量计算生成新时长列方法
dplyr 实现批量计算时长差值的方法
首先确保你安装并加载了1.0.0及以上版本的dplyr包,使用across()函数可以批量匹配目标列完成计算,无需手动逐个写列名。
步骤1:构造示例数据(你本地有数据可跳过这一步)
library(dplyr) df <- tibble( id = 1:4, start_year = c(2010, 2012, 2015, 2021), subj1_year = c(2001, 2002, 2003, 2004), subj2_year = c(2003, 2004, 2005, 2006) )
步骤2:批量计算差值
df_result <- df %>% mutate( # 匹配所有列名含subj的列,计算和start_year的差值 across(contains("subj"), ~ start_year - .x, # 定义新列命名规则:移除原列名的_year后缀,拼接_duration .names = "{stringr::str_remove(col, '_year')}_duration") )
参数说明
contains("subj"):列选择规则,匹配所有列名中包含subj字符的列,若需要严格匹配大小写可以加参数ignore.case = FALSE~ start_year - .x:匿名计算函数,.x指代每一个被选中的subj列.names:新生成列的命名规则,自动替换原列名后缀后生成符合要求的新列名
运行后输出的df_result和你给出的预期结果完全一致。
如果使用的是1.0.0版本以下的dplyr,也可以用mutate_at实现:
df_result <- df %>% mutate_at(vars(contains("subj")), list(duration = ~ start_year - .x)) %>% # 调整列名符合要求 rename_with(~stringr::str_remove(., "_year"), ends_with("duration"))
内容的提问来源于stack exchange,提问作者Erin
相关产品推荐
相关产品推荐

