使用dplyr按匹配条件删除数据框中的行
问题描述
给定如下数据框:
df <- data.frame(col1 = c("a", "a", "m", "m", "m", "m", "n", "q"), col2 = c("a", "b", "m", "x", "y", "z", NA, "p"))
数据预览:
col1 col2 1 a a 2 a b 3 m m 4 m x 5 m y 6 m z 7 n <NA> 8 q p
需求:仅保留以下两类行:
- col1的值未在col2中出现过的所有行(如示例中n、q对应的行)
- col1的值在col2中出现过,且
col1 == col2的行(如示例中aa、mm的行)
注意:实际数据集规模极大,不能通过指定具体值(如'a'、'm')进行筛选。
期望输出:
col1 col2 1 a a 2 m m 3 n <NA> 4 q p
解决方案
方法1:基础R(高效适配大数据集)
先提取col2中非NA的唯一值集合,再通过逻辑条件完成筛选:
# 获取col2中存在的非NA值集合 col2_vals <- na.omit(unique(df$col2)) # 筛选逻辑:col1不在col2值集合中, 或者col1与col2值相等 df_filtered <- df[!df$col1 %in% col2_vals | df$col1 == df$col2, ]
方法2:dplyr(语法更简洁直观)
若习惯使用tidyverse工具链,可通过dplyr实现:
library(dplyr) df_filtered <- df %>% # 定义col2的非NA唯一值集合 mutate(col2_vals = list(na.omit(unique(col2)))) %>% # 应用筛选条件 filter(!col1 %in% unlist(col2_vals) | col1 == col2) %>% # 移除临时辅助列 select(-col2_vals)
两种方案均基于向量级操作,避免了低效循环,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

