Можно ли использовать один условный вызов mutate для присвоения значений нескольким переменным?
Например, в приведенном ниже примере, когда cat == "a"
, я хочу присвоить значение «1» для столбца «foo», а также значение «три» для столбца «bar». Аналогично, когда cat == "b"
, присвойте «2» и «четыре».
Следующее достигается этим, но требует, чтобы вызов case_when
повторялся для каждой переменной
require(tidyverse)
df <- tibble(cat = c("a", "b", "a", "a", "c"))
df %>%
mutate(foo = case_when(cat == "a" ~ 1,
cat == "b" ~ 2,
TRUE ~ NA_real_)) %>%
mutate(bar = case_when(cat == "a" ~ "three",
cat == "b" ~ "four",
TRUE ~ NA_character_))
Я думал, что создание столбца списка может быть полезным, что-то вроде
df %>%
mutate(case_when(cat == "a" ~ list("foo" = 1, "bar" = "three"),
cat == "b" ~ list("foo" = 2, "bar" = "four"),
TRUE ~ NA_real_))
, но case_when
принимает только отдельные значения для RHS.
Одним из решений (например, здесь ) является создание «эталонного» фрейма данных и join
его, например
require(tidyverse)
ref <- tibble(cat = c("a", "b"), foo = c(1, 2), bar = c("three", "four"))
df %>% left_join(ref)
однако это не будет работать, когда «условие» не является категориальным, например, x > 2
Есть предложения по хорошему способу сделать это? Спасибо