Я пытаюсь использовать case_when
для изменения / изменения столбца на основе двух отдельных входов. Тот, который используется для создания логической LHS и соответствующего входного значения в RHS. Пример приведен ниже.
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
все оценивается как выражение, но я не совсем уверен. Можно ввести вручную все 7 строк в case_when
, но мое приложение требует, чтобы я выполнил это, когда векторы 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)
}