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

R语言如何筛选所有行均为指定值的数据框列

问题场景

现有测试数据框结构如下:

Apple   Orange  Strawberry
0           1       1
0           1       1
0           1       0
0           1       0
0           1       0
0           1       1
0           1       1

目标是提取所有行取值均为指定值(示例指定值为0)的列名,本例预期输出为Apple。
此前尝试运行代码df[rowSums(df<1)==0, ],仅返回带所有列名的空数据框,无法得到正确结果。

原有代码问题
  • 索引位置写错:R数据框索引规则为df[行筛选条件, 列筛选条件],需求是筛选列,条件应该写在逗号右侧,原代码把条件写在逗号左侧是在行维度做筛选,方向错了。
  • 判断逻辑写反:df < 1匹配值为0的单元格,rowSums(df<1)==0代表当前行不存在值为0的单元格(即全为1),和需求的匹配逻辑完全相反。
可运行实现方案

以下方案均以匹配目标值0为例,修改target_val参数即可适配其他指定值的匹配需求。

方案1:base R 最简写法(无依赖)

通过colSums统计每列中不等于目标值的单元格数量,数量为0即代表整列全为目标值:

# 构造示例数据
df <- data.frame(
  Apple = rep(0, 7),
  Orange = rep(1, 7),
  Strawberry = c(1,1,0,0,0,1,1)
)

# 执行筛选
target_val <- 0
res <- names(df)[colSums(df != target_val) == 0]

运行后res返回值为"Apple",符合预期。

方案2:apply逐列校验(适配复杂判断逻辑)

如果后续需要增加更复杂的列判断规则,可以用apply逐列做全量匹配校验:

target_val <- 0
res <- names(df)[apply(df, 2, function(x) all(x == target_val))]

方案3:dplyr 语法实现

如果日常使用tidyverse生态的代码,可以用where选择器做筛选:

library(dplyr)
target_val <- 0
res <- df %>% 
  select(where(~ all(.x == target_val))) %>% 
  names()

内容的提问来源于stack exchange,提问作者thentangler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:39:19