基于多列匹配为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
相关产品推荐
相关产品推荐

