如何用R(含dplyr)筛选数据框:保留B组与A组匹配的行
使用dplyr实现指定数据筛选需求
当然可以用dplyr完成这个筛选任务,下面是两种高效的实现方式,附示例代码:
1. 构造示例数据
library(dplyr) # 模拟你的数据集 df <- tibble( group = c("A", "A", "A", "B", "B", "B", "B", "B"), number = c(1, 2, 3, 1, 2, 4, 3, 5), animal = c("cat", "dog", "bird", "cat", "dog", "fish", "bird", "fox") )
2. 实现方式一:拆分筛选后合并
这种方式逻辑直观,先单独保留A组所有行,再筛选出B组中与A组number+animal匹配的行,最后合并结果:
filtered_df <- df %>% # 保留所有A组数据 filter(group == "A") %>% # 追加符合条件的B组数据 bind_rows( df %>% filter(group == "B") %>% # 仅保留与A组number和animal同时匹配的行 semi_join(df %>% filter(group == "A"), by = c("number", "animal")) )
3. 实现方式二:单步筛选
通过一次filter操作完成,利用逻辑条件直接判断:
# 先提取A组的number-animal唯一匹配组合 a_matches <- df %>% filter(group == "A") %>% select(number, animal) %>% distinct() filtered_df <- df %>% filter( # 保留所有A组行 group == "A" | # B组行需满足number和animal同时在A组的匹配组合中 (group == "B" & inner_join(., a_matches, by = c("number", "animal")) %>% complete.cases()) )
两种方法都能达到你的需求:保留A组全部行,仅保留B组中number和animal同时与A组某行匹配的记录,自动移除不符合条件的行(比如示例中的最后两行)。
内容的提问来源于stack exchange,提问作者spencergw
相关产品推荐
相关产品推荐

