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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:27:03