在 dplyr 中的两列之间进行过滤,其中一列是列表或向量

Mat*_* W. 2 r strsplit dplyr

尝试通过比较列中prod存在的这两列来过滤此 df lob

可重现的代码:

df <- data.frame(prod = c("CES", "Access", "Access", "CES"), lob = c("Access;Entertainment", "CES", "Access", "Access;Entertainment;CES"))

    prod                      lob
1    CES     Access;Entertainment
2 Access                      CES
3 Access                   Access
4    CES Access;Entertainment;CES
Run Code Online (Sandbox Code Playgroud)

预期结果:

    prod                      lob
1 Access                   Access
2    CES Access;Entertainment;CES
Run Code Online (Sandbox Code Playgroud)

我尝试将 lob 列拆分为向量或包含元素的列表,然后dplyr filtergrepl(prod, lob), or 一起使用prod %in% lob,但似乎都不起作用

df %>%
filter(prod %in% lob)

df %>%
mutate(lob = strsplit(lob, ";")) %>%
filter(prod %in% lob)

df %>%
mutate(lob = strsplit(lob, ";")) %>%
filter(grepl(prod), lob)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

rowwise()在那里添加一个可能是最简单的

df %>%
  mutate(lob = strsplit(lob, ";")) %>% 
  rowwise() %>% 
  filter(prod %in% lob) %>% 
  as.data.frame() # rowwise makes it a tibble, this changes it back if needed
Run Code Online (Sandbox Code Playgroud)

如果你真的不想做mutate(),你可以做

df %>%
  rowwise() %>% 
  filter(prod %in% strsplit(lob, ";")[[1]])
Run Code Online (Sandbox Code Playgroud)

  • 带有 purrr 和 magrittr 的“现代”变体:`df %&gt;% mutate(lob = strsplit(lob, ";")) %&gt;% filter(map2_lgl(prod, lob, is_in))` (2认同)