1

我正在尝试使用 mutate 声明变量,all_of但没有得到正确的输出

asd <- data.frame(Col1 = c("A","B"), Col2 = c("R","E"))
a1 <- "Col1"

当我执行以下操作时,我得到无效的输出

asd %>% mutate(q1 = case_when(all_of(a1) == "A" ~ 1))
  Col1 Col2 a1
1    A    R NA
2    B    E NA

预期产出

asd %>% mutate(q1 = case_when(Col1 == "A" ~ 1))
  Col1 Col2 q1
1    A    R  1
2    B    E NA
4

3 回答 3

3

或者我们可以使用glue::glue记住,无论你放在花括号内的任何内容都将被评估为 R 代码:

library(glue)

asd %>%
  mutate(q1 = case_when(
    eval(parse(text = glue("{a1}"))) == "A" ~ 1
  ))

  Col1 Col2 q1
1    A    R  1
2    B    E NA
于 2021-08-19T15:57:17.780 回答
2

把它包起来get()

R> asd %>% mutate(q1 = case_when(all_of(get(a1)) == "A" ~ 1))
  Col1 Col2 q1
1    A    R  1
2    B    E NA
于 2021-08-19T13:44:38.450 回答
0

我们可以使用across

library(dplyr)
library(stringr)
asd %>% 
   mutate(across(all_of(a1), ~ case_when(. == 'A' ~ 1),
    .names = "{str_replace(.col, '.*', 'q1')}"))
  Col1 Col2 q1
1    A    R  1
2    B    E NA
于 2021-08-19T17:19:45.757 回答