使用 "dplyr::mutate" 时将字符转换为列名
Convert a character to a column name when using "dplyr::mutate"
我正在尝试动态创建列的名称并在 mutate
中使用它
- 我的
df
预测月份为 "p1"、"p2"
- 我想计算与实际的差异
- 我要输入的只是预测周期代码,例如:"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 - .))
我正在尝试动态创建列的名称并在 mutate
- 我的
df
预测月份为 "p1"、"p2" - 我想计算与实际的差异
- 我要输入的只是预测周期代码,例如:"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 - .))