You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:43:21