使用 "dplyr::mutate" 时将字符转换为列名

Convert a character to a column name when using "dplyr::mutate"

我正在尝试动态创建列的名称并在 mutate

中使用它
  1. 我的 df 预测月份为 "p1"、"p2"
  2. 我想计算与实际的差异
  3. 我要输入的只是预测周期代码,例如:"p1"求出答案

样本 df

df <- data.frame(stringsAsFactors=FALSE,
          product = c("aa", "bb", "cc"),
      act_rev_mtd = c(100L, 110L, 120L),
     rev_fcast_p1 = c(100L, 100L, 100L),
     rev_fcast_p2 = c(110L, 110L, 110L)
  )

reporting_mth <- "p1"

这是我试过的方法,但不起作用:

df1 <- df %>%
  mutate(mtd_rev_var = act_rev_mtd - !!paste0("rev_fcast_", reporting_mth))

您可以使用 get() 而不是 !! 来按名称搜索对象:

df1 <- df %>%
  mutate(mtd_rev_var = act_rev_mtd - get(paste0("rev_fcast_", reporting_mth)))

结果是:

df1
  product act_rev_mtd rev_fcast_p1 rev_fcast_p2 mtd_rev_var
1      aa         100          100          110           0
2      bb         110          100          110          10
3      cc         120          100          110          20

我们可以将它从 rlang 转换为带有 sym 的符号,然后执行 !!

df %>%
    mutate(mtd_rev_var = act_rev_mtd - !!rlang::sym(paste0("rev_fcast_", reporting_mth)))
#     product act_rev_mtd rev_fcast_p1 rev_fcast_p2 mtd_rev_var
#1      aa         100          100          110           0
#2      bb         110          100          110          10   
#3      cc         120          100          110          20

或者在 mutate_at

中将其作为字符串传递
df %>%
   mutate_at(vars(paste0("rev_fcast_", reporting_mth)), funs(mtd_rev_var = act_rev_mtd - .))