You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计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)

df1结构示意图

  • 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)

df2结构示意图

需求说明

统计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的计数结果如下:

P1P2P3P4P5match_count
ABAANA2
ANABBNA3
BBBNANA3
NABABB2

内容的提问来源于stack exchange,提问作者Yulia Kentieva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:01