如何在R中基于两列的共同值筛选两个数据框的子集
基于多列共同值筛选R数据框子集
方法一:使用dplyr(tidyverse)
首先创建可复现的测试数据:
# 创建测试数据框 df1 <- data.frame( V1 = c("X", "X", "Y", "Z", "Z"), V2 = c("Q", "E", "W", "Q", "Q"), V3 = c("D", "D", "Y", "V", "J"), V4 = c("O", "Z", "A", "Q", "E"), stringsAsFactors = FALSE ) df2 <- data.frame( V1 = c("X", "B", "Y", "A", "Z"), V2 = c("Q", "E", "W", "Q", "Q"), V3 = c("M", "U", "C", "D", "D"), V4 = c("P", "U", "I", "V", "D"), stringsAsFactors = FALSE )
接下来执行筛选:
library(dplyr) # 提取两个数据框共有的(V1, V2)唯一组合 common_pairs <- inner_join( distinct(df1, V1, V2), distinct(df2, V1, V2), by = c("V1", "V2") ) # 筛选df1子集(每个(V1,V2)组合保留一行) df1_subset <- df1 %>% inner_join(common_pairs, by = c("V1", "V2")) %>% distinct(V1, V2, .keep_all = TRUE) # 筛选df2子集(每个(V1,V2)组合保留一行) df2_subset <- df2 %>% inner_join(common_pairs, by = c("V1", "V2")) %>% distinct(V1, V2, .keep_all = TRUE)
运行后得到的结果与期望完全一致:
- df1_subset:
V1 V2 V3 V4 1 X Q D O 2 Y W Y A 3 Z Q J E - df2_subset:
V1 V2 V3 V4 1 X Q M P 2 Y W C I 3 Z Q D D
如果需要保留所有匹配的行(比如df1中两个(Z,Q)行都保留),只需去掉distinct()步骤:
# 保留所有匹配行的df1子集 df1_subset_all <- df1 %>% inner_join(common_pairs, by = c("V1", "V2"))
方法二:使用Base R
如果不想依赖第三方包,可以用原生R实现:
# 将(V1,V2)组合转为字符串,方便比较 df1_pairs <- paste(df1$V1, df1$V2, sep = "-") df2_pairs <- paste(df2$V1, df2$V2, sep = "-") # 找出两个数据框共有的唯一组合 common_pairs_unique <- unique(df1_pairs[df1_pairs %in% df2_pairs]) # 筛选df1子集(每个组合保留第一行) df1_subset_base <- df1[match(common_pairs_unique, df1_pairs), ] # 筛选df2子集(每个组合保留第一行) df2_subset_base <- df2[match(common_pairs_unique, df2_pairs), ]
若要保留所有匹配行,直接用逻辑索引筛选:
# 保留所有匹配行的df1子集 df1_subset_all_base <- df1[df1_pairs %in% common_pairs_unique, ]
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

