R语言数据框两列元素匹配:匹配状态识别及缺失值查找
R语言实现逗号分隔列比对与缺失值标记
示例数据
df <- data.frame( A = c('100, 200, 300, 100', '100, 200', '100, 200, 300'), B = c('100, 200, 300', '100, 200, 300', '100, 200'), stringsAsFactors = FALSE )
实现方法
方法1:使用tidyverse生态包(代码易读性高)
# 加载依赖包 library(dplyr) library(purrr) library(stringr) df_result <- df %>% rowwise() %>% mutate( # 拆分列字符串为向量,去除空格、对重复元素去重 list_A = list(unique(str_trim(str_split(A, ",")[[1]]))), list_B = list(unique(str_trim(str_split(B, ",")[[1]]))), # 判断元素是否完全匹配 Flag = ifelse(setequal(list_A, list_B), "Y", "N"), # Value_A存储A列缺失、B列存在的元素 Value_A = ifelse(Flag == "N", paste(setdiff(list_B, list_A), collapse = ", "), NA_character_), # Value_B存储B列缺失、A列存在的元素 Value_B = ifelse(Flag == "N", paste(setdiff(list_A, list_B), collapse = ", "), NA_character_) ) %>% ungroup() %>% # 移除中间计算用的列表列 select(-list_A, -list_B)
运行后得到的结果如下:
| A | B | Flag | Value_A | Value_B |
|---|---|---|---|---|
| 100, 200, 300, 100 | 100, 200, 300 | Y | NA | NA |
| 100, 200 | 100, 200, 300 | N | 300 | NA |
| 100, 200, 300 | 100, 200 | N | NA | 300 |
方法2:基础R实现(无需安装第三方包)
# 自定义按行比对函数 compare_cols <- function(a, b) { list_A <- unique(trimws(strsplit(a, ",")[[1]])) list_B <- unique(trimws(strsplit(b, ",")[[1]])) flag <- ifelse(setequal(list_A, list_B), "Y", "N") val_a <- ifelse(flag == "N", paste(setdiff(list_B, list_A), collapse = ", "), NA_character_) val_b <- ifelse(flag == "N", paste(setdiff(list_A, list_B), collapse = ", "), NA_character_) return(data.frame(Flag = flag, Value_A = val_a, Value_B = val_b)) } # 批量应用函数到每行,合并结果 df_result <- cbind(df, do.call(rbind, mapply(compare_cols, df$A, df$B, SIMPLIFY = FALSE)))
注意事项
- 如果业务场景要求统计元素出现次数的差异(如A列有2个100、B列只有1个100视为不匹配),删除代码中的
unique()函数即可。 - 同一列存在多个缺失值时,会自动用逗号拼接后填入对应字段。
内容的提问来源于stack exchange,提问作者P Initiate
相关产品推荐
相关产品推荐

