如何用tidyverse筛选所有列值均为"No"的行?
解决方案:筛选所有食物列均为"No"的行
你的原代码filter(Apple:Strawberry=="No")不生效的原因是:Apple:Strawberry这种写法在dplyr里不是选择列范围,而是尝试生成变量名序列(类似1:5生成数字序列),且这种比较方式无法逐行检查所有列是否都等于"No"。
下面给你两种适配40多列食物项场景的实用解决方法:
方法一:用dplyr的if_all函数(推荐,代码更直观)
if_all是dplyr 1.0.0及以上版本的函数,可指定列范围,检查每一行的所有指定列是否都满足条件:
food_history <- food %>% filter(if_all(Apple:Strawberry, ~ .x == "No"))
如果食物列不是连续的(中间夹杂非食物列),可以用列名匹配的方式选择:
# 直接列出所有食物列名 food_history <- food %>% filter(if_all(c("Apple", "Banana", "Sandwich", "Yogurt", "Strawberry"), ~ .x == "No")) # 若食物列有统一命名规则(比如都以"food_"开头),可简化为: food_history <- food %>% filter(if_all(starts_with("food_"), ~ .x == "No"))
方法二:用rowSums统计非"No"的数量
这种方法用基础R思路,计算每行中不等于"No"的单元格数量,数量为0的就是所有列都是"No"的行:
# 选中连续的食物列 food_cols <- Apple:Strawberry food_history <- food %>% filter(rowSums(across(food_cols, ~ .x != "No")) == 0) # 基础R版本写法: food_history <- food[rowSums(food[, c("Apple", "Banana", "Sandwich", "Yogurt", "Strawberry")] != "No") == 0, ]
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

