如何在分组内检查df1元素是否存在于df2中(tidyverse实现)
按分组(z)匹配标记存在性(Tidyverse实现)
原始数据
library(dplyr) df1 <- data.frame(x = c(1, 2, 3, 4), z = c("A", "A", "B", "B")) df2 <- data.frame(x = c(2, 4, 6, 8), z = c("A", "A", "B", "C"))
需求说明
为df1添加present列,仅当该行的z分组与df2中某行的z分组相同、且x值也相同时,present设为TRUE。预期仅df1中x=2、z=A的行present为TRUE。
解决方案
以下是几种符合Tidyverse风格的实现方式:
方法1:分组后逐组匹配
通过group_by(z)分组,利用cur_group()获取当前组的z值,筛选df2对应组的x进行匹配:
df1 <- df1 %>% group_by(z) %>% mutate(present = x %in% df2$x[df2$z == cur_group()$z]) %>% ungroup()
方法2:左连接后判断匹配
按x和z左连接两个数据集,通过判断是否存在匹配行标记present:
df1 <- df1 %>% left_join(df2 %>% select(x, z), by = c("x", "z")) %>% mutate(present = !is.na(z.y)) %>% select(-z.y)
方法3:半连接筛选匹配行
用semi_join筛选出df1中与df2按x和z匹配的行,再标记这些行的present为TRUE:
matched <- df1 %>% semi_join(df2, by = c("x", "z")) df1 <- df1 %>% mutate(present = row_number() %in% matched$row_number())
验证结果
执行任意方法后,df1的输出结果如下:
> df1 x z present 1 1 A FALSE 2 2 A TRUE 3 3 B FALSE 4 4 B FALSE
内容的提问来源于stack exchange,提问作者bill999
相关产品推荐
相关产品推荐

