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

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)

运行后得到的结果如下:

ABFlagValue_AValue_B
100, 200, 300, 100100, 200, 300YNANA
100, 200100, 200, 300N300NA
100, 200, 300100, 200NNA300

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:45:02