统计R语言数据框df1每行在df2中出现次数(NA视为通配符)
数据集构造
- df1构造代码:
P1 <- c('A', 'A', 'B', NA) P2 <- c('B', NA, 'B', 'B') P3 <- c('A', 'B', 'B', 'A') P4 <- c('A', 'B', NA, 'B') P5 <- c(NA, NA, NA, 'B') df1 <- data.frame(P1, P2, P3, P4, P5, row.names = NULL)

- df2构造代码:
P1 <- c('A', 'A', 'B', 'B', 'A', 'B', 'B', 'A') P2 <- c('B', 'B', 'B', 'B', 'B', 'B', 'A', 'B') P3 <- c('A', 'B', 'B', 'A', 'A', 'B', 'B', 'A') P4 <- c('A', 'B', 'B', 'B', 'A', 'B', 'A', 'B') P5 <- c('B', 'B','B', 'B', 'B', 'B', 'A', 'B') df2 <- data.frame(P1, P2, P3, P4, P5, row.names = NULL)

需求说明
统计df1中每一行在df2中的出现次数,匹配规则为:若df1中某字段值为NA,则该字段在df2中取值为A或B均视为匹配成功。例如df1的第4行可匹配df2的第4、8两行,对应计数为2。
实现代码
基础R版本实现,小数据量场景可直接使用:
# 逐行匹配计数 match_count <- apply(df1, 1, function(row_x) { sum(apply(df2, 1, function(row_y) { all(is.na(row_x) | row_x == row_y) })) }) # 把计数结果合并到df1中查看 df1$match_count <- match_count
如果是大数据量场景,可以用向量化运算替代嵌套apply提升性能,示例如下:
library(dplyr) match_count <- sapply(1:nrow(df1), function(i) { cond <- df2 %>% filter( is.na(df1$P1[i]) | P1 == df1$P1[i], is.na(df1$P2[i]) | P2 == df1$P2[i], is.na(df1$P3[i]) | P3 == df1$P3[i], is.na(df1$P4[i]) | P4 == df1$P4[i], is.na(df1$P5[i]) | P5 == df1$P5[i] ) %>% nrow() return(cond) }) df1$match_count <- match_count
输出结果
最终df1的计数结果如下:
| P1 | P2 | P3 | P4 | P5 | match_count |
|---|---|---|---|---|---|
| A | B | A | A | NA | 2 |
| A | NA | B | B | NA | 3 |
| B | B | B | NA | NA | 3 |
| NA | B | A | B | B | 2 |
内容的提问来源于stack exchange,提问作者Yulia Kentieva
相关产品推荐
相关产品推荐

