将 case_when 与多个向量一起使用

EJJ*_*EJJ 5 r dplyr

我正在尝试case_when根据两个单独的输入来修改/变异列。用于在右侧创建左侧逻辑和相应输入值的一个。下面提供了一个示例。

library(dplyr)
library(purrr)
library(tibble)

df <- tibble(var = paste0(rep("var", 10), 1:10),
                 label = c("label1", "label2", rep(NA, 7), "label10"))

match_var <- paste0(rep("var", 7), 3:9)
new_labels <- paste0(rep("add_this_label", 7), 3:9)

df %>% 
  mutate(test = map2(match_var , new_labels,
                     ~case_when(
                       var == .x ~ .y,
                       TRUE ~ label
                     )
  ))
Run Code Online (Sandbox Code Playgroud)

我认为问题在于,case_when所有内容都被评估为表达式,但我不完全确定。人们可以手动输入其中的所有 7 行case_when,但我的应用程序要求我在向量match_varsnew_labels很长时完成此操作 - 使得手动输入case_when不可行。

df %>% 
  mutate(label = case_when(
    var == match_var[1] ~ new_labels[1],
    var == match_var[2] ~ new_labels[2],
    var == match_var[3] ~ new_labels[3],
    var == match_var[4] ~ new_labels[4],
    var == match_var[5] ~ new_labels[5],
    var == match_var[6] ~ new_labels[6],
    var == match_var[7] ~ new_labels[7],
    TRUE ~ label
  ))
Run Code Online (Sandbox Code Playgroud)

编辑:可以使用循环来实现所需的结果for,但现在我想知道这是否可以使用case_whenmap2_*运行?

for (i in seq_along(match_var)) {
  df$label <- ifelse(df$var == match_var[i], new_labels[i], df$label)
}
Run Code Online (Sandbox Code Playgroud)

akr*_*run 2

我们创建一个命名向量并使用它来匹配“var”中的值,以便将 NA 元素更改为“new_labels”

library(tibble)
library(dplyr)
df %>%
    mutate(label = case_when(is.na(label) ~ 
                       deframe(tibble(match_var, new_labels))[var], 
         TRUE ~ label))
# A tibble: 10 x 2
#   var   label          
#   <chr> <chr>          
# 1 var1  label1         
# 2 var2  label2         
# 3 var3  add_this_label3
# 4 var4  add_this_label4
# 5 var5  add_this_label5
# 6 var6  add_this_label6
# 7 var7  add_this_label7
# 8 var8  add_this_label8
# 9 var9  add_this_label9
#10 var10 label10        
Run Code Online (Sandbox Code Playgroud)

注意:除了使用 之外,还deframe可以使用 创建命名向量setNames