如何让R代码自动识别最后一列目标列,无需在mutate中手动指定DR04
解决方案
直接替换mutate中across的列筛选规则即可,无需硬编码列范围,两种实现方式都可以达到自动识别所有DR列的效果:
修改后完整可运行代码
library(dplyr) library(tidyverse) library(lubridate) df1 <- structure( list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-04-02","2021-04-02","2021-04-08","2021-04-08"), Code = c("ABC","CDE","ABC","CDE"), Week= c("Friday","Friday","Thursday","Thursday"), DR1 = c(11,17,14,13), DR01 = c(14,11,14,13), DR02= c(14,12,16,17),DR03= c(19,15,14,13), DR04 = c(15,14,13,13)), class = "data.frame", row.names = c(NA, -4L)) x<-df1 %>% select(starts_with("DR")) x<-cbind(df1, setNames(df1$DR1 - x, paste0(names(x), "_PV"))) pk<-select(x, date2,Code, Week, DR1, ends_with("PV")) med<-pk %>% group_by(Code, Week) %>% summarize(across(ends_with("PV"), median)) df1 %>% inner_join(med, by = c('Code', 'Week')) %>% # 核心修改:用正则匹配所有DR开头+数字结尾的列,自动识别所有DR列,无需手动指定DR04 mutate(across(matches("^DR\\d+$"), ~.x + get(paste0(cur_column(), '_PV')), .names = '{col}_{col}_PV')) %>% select(date1:Week, DR1_DR1_PV:last_col())
可选实现方式
如果不想用正则,可以复用你之前已经筛选好的DR列名:
# 提前提取所有DR列名 dr_cols <- names(df1 %>% select(starts_with("DR"))) df1 %>% inner_join(med, by = c('Code', 'Week')) %>% mutate(across(all_of(dr_cols), ~.x + get(paste0(cur_column(), '_PV')), .names = '{col}_{col}_PV')) %>% select(date1:Week, DR1_DR1_PV:last_col())
两种方式运行结果都和你原来的代码完全一致,后续如果新增DR05、DR06等列,代码不需要任何修改就能自动适配。
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

