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
相关产品推荐
相关产品推荐

