R语言如何不按行顺序比对两个数据集的每行重复值
R语言比对两个数据集行一致性的简便方案
你原来的全连接逻辑是可行的,可根据不同需求选择更简洁的实现方案:
场景1:需要输出带行索引的合并归属结果(和你预期输出结构一致)
用dplyr的case_when替换多层嵌套ifelse,代码可读性更高,无需修改原有逻辑:
library(dplyr) # 示例数据 a=c(1,1) b=c(2,2) c=c(3,3) d=c(4,5) df1<-rbind(a,b,c) %>% as.data.frame() df2<-rbind(a,d,b) %>% as.data.frame() # 核心实现 df1$idx1 <- 1:nrow(df1) df2$idx2 <- 1:nrow(df2) res <- full_join(df1, df2, by = c("V1","V2")) %>% mutate(need = case_when( !is.na(idx1) & !is.na(idx2) ~ "duplicated", !is.na(idx1) ~ "only_df1", TRUE ~ "only_df2" ))
输出结果和你给出的预期完全相同。
场景2:不需要保留行索引,仅拆分不同归属的行
直接用dplyr的集合操作函数,代码量更少:
# 两个数据集共有的行 common_rows <- semi_join(df1, df2, by = c("V1","V2")) # 仅在df1中存在的行 only_df1 <- anti_join(df1, df2, by = c("V1","V2")) # 仅在df2中存在的行 only_df2 <- anti_join(df2, df1, by = c("V1","V2"))
场景3:不想加载第三方包,用基础R实现
将每行拼接为唯一字符串后匹配即可:
# 把每行的所有列拼接为唯一标识 row_id1 <- do.call(paste, df1) row_id2 <- do.call(paste, df2) # 直接给原数据集打归属标 df1$need <- ifelse(row_id1 %in% row_id2, "duplicated", "only_df1") df2$need <- ifelse(row_id2 %in% row_id1, "duplicated", "only_df2")
内容的提问来源于stack exchange,提问作者younghyun
相关产品推荐
相关产品推荐

