我正在尝试使用case_when
来基于两个单独的输入来修改/更改列。一种用于在RHS上创建LHS逻辑和相应输入值的模块。下面提供了一个示例。
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
)
))
我认为问题在于case_when
中的所有内容都被评估为表达式,但我不确定。可以手动键入case_when
中的所有7行,但是我的应用程序要求我在向量match_vars
和new_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
))
编辑:可以使用for
循环来实现所需的结果,但是现在我想知道使用case_when
和map2_*
函数是否可以实现?
for (i in seq_along(match_var)) {
df$label <- ifelse(df$var == match_var[i], new_labels[i], df$label)
}
答案 0 :(得分: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
注意:除了使用deframe
之外,还可以使用setNames
创建命名向量
答案 1 :(得分:1)
您可以将新标签加入数据框,并根据需要填写旧标签。
library("tidyverse")
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_label <- paste0(rep("add_this_label", 7), 3:9)
new_labels <- tibble(match_var, new_label)
df %>%
left_join(new_labels, by = c("var" = "match_var")) %>%
mutate(new_label = if_else(is.na(new_label), label, new_label))
#> # A tibble: 10 x 3
#> var label new_label
#> <chr> <chr> <chr>
#> 1 var1 label1 label1
#> 2 var2 label2 label2
#> 3 var3 <NA> add_this_label3
#> 4 var4 <NA> add_this_label4
#> 5 var5 <NA> add_this_label5
#> 6 var6 <NA> add_this_label6
#> 7 var7 <NA> add_this_label7
#> 8 var8 <NA> add_this_label8
#> 9 var9 <NA> add_this_label9
#> 10 var10 label10 label10
由reprex package(v0.2.1)于2019-03-28创建
答案 2 :(得分:0)
由于您正在比较==
条件,因此也可以使用命名向量对dplyr::recode
进行此操作(请注意需要取消引用!!!
的拼接):
df %>%
mutate(
label = recode(
var,
!!!setNames(new_labels, match_var),
.default = label
)
)