使用命名列表为 case_when 生成案例
Using named list to generate cases for case_when
我正在尝试弄清楚如何将 case_when 用于存储在列表中的组,因此修改列表将修改 case_when 的结果。
这是一个玩具测试用例:
library(tidyverse)
info <- tibble(target = letters[seq(1, 10)])
groups <- list("A" = letters[seq(1, 10, by = 3)],
"B" = letters[seq(2, 10, by = 3)],
"C" = letters[seq(3, 10, by = 3)])
info %>% mutate(case_when(
target %in% groups$A ~ names(groups)[1],
target %in% groups$B ~ names(groups)[2],
target %in% groups$C ~ names(groups)[3]
))
这给出了我想要的输出,但我想从列表中动态生成 case_when 中的选项。我想它会是这样的:
generate_cases <- function(x, i) {
### I have no idea what to do here...
}
cases <- groups %>% imap(generate_cases)
info %>% mutate(case_when(!!! cases))
我怀疑某些东西使用了 quo() 和 rlang::expr() 但我真的不知道如何将它们串在一起。
这是使用 purrr::imap
函数的一种方法
cases <- imap(groups, ~quo(target %in% !!.x ~ !!.y))
info %>% mutate(case_when(
!!!cases
))
一个更好的选择可能是将您的组重塑为适当的查找 table 这样您就可以进行高效的左连接。一种方法是
info %>%
left_join(stack(groups), by=c("target"="values"))
我正在尝试弄清楚如何将 case_when 用于存储在列表中的组,因此修改列表将修改 case_when 的结果。
这是一个玩具测试用例:
library(tidyverse)
info <- tibble(target = letters[seq(1, 10)])
groups <- list("A" = letters[seq(1, 10, by = 3)],
"B" = letters[seq(2, 10, by = 3)],
"C" = letters[seq(3, 10, by = 3)])
info %>% mutate(case_when(
target %in% groups$A ~ names(groups)[1],
target %in% groups$B ~ names(groups)[2],
target %in% groups$C ~ names(groups)[3]
))
这给出了我想要的输出,但我想从列表中动态生成 case_when 中的选项。我想它会是这样的:
generate_cases <- function(x, i) {
### I have no idea what to do here...
}
cases <- groups %>% imap(generate_cases)
info %>% mutate(case_when(!!! cases))
我怀疑某些东西使用了 quo() 和 rlang::expr() 但我真的不知道如何将它们串在一起。
这是使用 purrr::imap
函数的一种方法
cases <- imap(groups, ~quo(target %in% !!.x ~ !!.y))
info %>% mutate(case_when(
!!!cases
))
一个更好的选择可能是将您的组重塑为适当的查找 table 这样您就可以进行高效的左连接。一种方法是
info %>%
left_join(stack(groups), by=c("target"="values"))