如何统计两个DataFrame中同列不同类别值的匹配数量?
解决方案
根据你的需求,以下是几种常见的匹配统计实现方案,基于dplyr完成:
1. 合并两个DataFrame的统计结果,展示所有类别及双方计数
该方案会汇总所有出现过的类别,同时显示每个类别在DF1和DF2中的出现次数,并标记是否为共同类别:
library(dplyr) DF1 <- data.frame(Firm1 = c("A", "B", "C", "L", "M", "L")) DF2 <- data.frame(Firm2 = c("L", "M", "N", "P")) # 对两个DataFrame分别做分组计数,统一列名便于合并 df1_count <- DF1 %>% group_by(Firm = Firm1) %>% summarise(count_df1 = n(), .groups = "drop") df2_count <- DF2 %>% group_by(Firm = Firm2) %>% summarise(count_df2 = n(), .groups = "drop") # 全连接合并,填补缺失计数为0,标记共同类别 combined_result <- full_join(df1_count, df2_count, by = "Firm") %>% mutate( count_df1 = ifelse(is.na(count_df1), 0, count_df1), count_df2 = ifelse(is.na(count_df2), 0, count_df2), is_common = count_df1 > 0 & count_df2 > 0 ) print(combined_result)
执行后输出:
Firm count_df1 count_df2 is_common 1 A 1 0 FALSE 2 B 1 0 FALSE 3 C 1 0 FALSE 4 L 2 1 TRUE 5 M 1 1 TRUE 6 N 0 1 FALSE 7 P 0 1 FALSE
2. 仅统计DF1中与DF2重叠的类别及计数
如果只需要DF1里同时出现在DF2中的类别及其出现次数:
df1_common <- df1_count %>% filter(Firm %in% df2_count$Firm) print(df1_common)
执行后输出:
Firm count_df1 1 L 2 2 M 1
3. 仅统计DF2中与DF1重叠的类别及计数
如果只需要DF2里同时出现在DF1中的类别及其出现次数:
df2_common <- df2_count %>% filter(Firm %in% df1_count$Firm) print(df2_common)
执行后输出:
Firm count_df2 1 L 1 2 M 1
注意点
之前使用%in%未成功,大概率是没有先提取对方DataFrame的类别向量(比如直接在分组内使用而非筛选环节),或者未统一类别列的名称,导致匹配逻辑出错。上述方案通过先统一列名、提取类别向量,再在filter中使用%in%实现精准匹配。
内容的提问来源于stack exchange,提问作者PhD Student
相关产品推荐
相关产品推荐

