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

基于多列匹配为R数据框添加对应type值的实现方案

解决方案:基于dplyr实现数据框匹配并填充type字段

核心思路

  • 针对cat_df的每一行,仅用非NA字段作为匹配条件
  • 逐行处理bld_g,在cat_df中筛选满足匹配条件的行,若存在则取对应的type值,否则赋值为0

代码实现

1. 构造测试数据

library(dplyr)

# 参考数据框:包含type字段,部分字段为NA
cat_df <- tibble(
  col1 = c("A", "B", NA, "C"),
  col2 = c(1, NA, 3, 4),
  col3 = c("X", "Y", "Z", NA),
  type = c(101, 102, 103, 104)
)

# 目标数据框:需要新增type字段,包含空值
bld_g <- tibble(
  col1 = c("A", "B", "D", "C", NA),
  col2 = c(1, 2, 3, 4, 3),
  col3 = c("X", "Y", "Z", "W", "Z")
)

2. 实现匹配逻辑

bld_g_with_type <- bld_g %>%
  rowwise() %>%
  mutate(
    type = {
      # 筛选cat_df中符合匹配规则的行:仅对比cat_df该行非NA的字段
      matched_rows <- cat_df %>%
        filter(
          across(
            all_of(setdiff(names(cat_df), "type")),  # 排除type字段
            ~ ifelse(is.na(.), TRUE, . == cur_data()[[cur_column()]])
          )
        )
      # 存在匹配行则取第一个type值,否则赋值0
      if (nrow(matched_rows) > 0) matched_rows$type[1] else 0
    }
  ) %>%
  ungroup()

关键代码解释

  • rowwise():开启逐行处理模式,确保mutate对bld_g的每一行单独计算
  • across():遍历cat_df中除type外的所有字段,对每个字段执行匹配规则:
    • 若cat_df当前字段值为NA,则跳过该字段的对比(直接判定为匹配)
    • 若cat_df当前字段值非NA,则对比与bld_g当前行的对应值是否相等
  • 最后根据筛选结果,返回第一个匹配到的type值,无匹配则返回0

验证结果

运行代码后,bld_g_with_type的输出如下:

# A tibble: 5 × 4
  col1   col2 col3   type
  <chr> <dbl> <chr> <dbl>
1 A         1 X       101
2 B         2 Y       102
3 D         3 Z       103
4 C         4 W       104
5 NA        3 Z       103

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:20:30