如何在R语言中筛选多列含Y的行并排除仅单列为Y的行
R语言:筛选指定多列中包含多个"Y"的行
需求说明
保留数据中**指定多列里至少有2个"Y"**的行,排除仅单一列含"Y"的行。
示例原始数据
先构造符合需求的示例数据:
df <- data.frame( ID = 1:5, ColA = c("Y", "N", "Y", "Y", "N"), ColB = c("N", "Y", "Y", "N", "Y"), ColC = c("Y", "N", "N", "Y", "N"), OtherCol = c("X", "X", "X", "X", "X") )
原始数据输出:
ID ColA ColB ColC OtherCol 1 1 Y N Y X 2 2 N Y N X 3 3 Y Y N X 4 4 Y N Y X 5 5 N Y N X
解决方案
方法1:Base R 实现
无需额外包,直接用行求和筛选:
# 定义需要检查的目标列 target_cols <- c("ColA", "ColB", "ColC") # 计算每行目标列中"Y"的数量,筛选数量≥2的行 filtered_df <- df[rowSums(df[target_cols] == "Y") >= 2, ]
方法2:dplyr 实现
适合习惯tidyverse风格的用户:
library(dplyr) filtered_df <- df %>% rowwise() %>% # 统计每行目标列中"Y"的数量 mutate(y_count = sum(c_across(all_of(target_cols)) == "Y")) %>% # 保留数量≥2的行 filter(y_count >= 2) %>% # 移除临时计数列 select(-y_count)
期望输出结果
运行上述代码后,得到的筛选结果:
ID ColA ColB ColC OtherCol 1 1 Y N Y X 2 3 Y Y N X 3 4 Y N Y X
注意事项
如果数据中存在NA值,需要在求和时忽略NA,避免结果出错:
- Base R:
rowSums(df[target_cols] == "Y", na.rm = TRUE) >= 2 - dplyr:
sum(c_across(all_of(target_cols)) == "Y", na.rm = TRUE)
内容的提问来源于stack exchange,提问作者rossio
相关产品推荐
相关产品推荐

