如何用dplyr判断数据框列表列中是否包含指定状态向量
报错原因
你代码报错的核心逻辑是:wanted_status %in% nstatus会返回和wanted_status长度一致的逻辑向量(示例中为长度2),但分组后每个分组的mutate要求返回长度为1的结果,长度不匹配触发了回收报错。你的需求是判断所有目标状态都被当前分组完整包含,需要用all()把多个逻辑判断结果聚合为单个布尔值。
修正后的代码
推荐更简洁的写法,无需额外构造列表列再去重,直接用summarise返回每组的判断结果:
library(tidyverse) dat <- tribble(~cell, ~status, "A", "x+", "A", "y-", "A", "z+", "B", "x-", "B", "y-", "B", "z+") wanted_status <- c("x+", "y-") dat %>% group_by(cell) %>% summarise(contained = if_else(all(wanted_status %in% status), "in", "out"))
输出结果
# A tibble: 2 × 2 cell contained <chr> <chr> 1 A in 2 B out
如果你要保留原有构造列表列的写法,只需要修改contained的计算逻辑即可:
dat %>% group_by(cell) %>% mutate(nstatus = list(status)) %>% dplyr::select(-status) %>% unique() %>% mutate(contained = if_else(all(wanted_status %in% unlist(nstatus)), "in", "out"))
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

