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

检测字符串向量差异:为data_frame新增name(.2)列对比列(偏好tidyverse/stringr)

这题我熟!用tidyverse+stringr完全可以轻松搞定,我先给你一步步演示,从构造示例数据到最终实现差异列的添加。

第一步:构造示例数据

首先我们模拟一个符合你需求的数据框,假设你的两列是name_old和name_new(如果你的实际列名是name和name.2,后面直接替换就行):

library(tidyverse)

# 模拟包含字符串向量的数据集
df <- tibble(
  id = 1:3,
  name_old = c("apple, banana, orange", "cat, dog", "red, blue, green, yellow"),
  name_new = c("banana, orange, grape", "dog, rabbit", "blue, purple")
)

第二步:添加差异列的核心代码

我们的思路是:先把每个字符串拆分成独立的字符向量,清理掉多余空格,然后计算两列向量的对称差异(也就是只在其中一列出现的元素),最后把差异元素合并成字符串作为新列。

这里用map2_chr直接生成结果列,省去中间临时列,更简洁:

df_with_diff <- df %>%
  mutate(
    name_diff = map2_chr(
      # 拆分并清理旧列的字符串向量
      str_split(name_old, ", ") %>% map(str_trim),
      # 拆分并清理新列的字符串向量
      str_split(name_new, ", ") %>% map(str_trim),
      # 计算对称差异并合并成字符串
      ~ str_c(union(setdiff(.x, .y), setdiff(.y, .x)), collapse = ", ")
    )
  )

第三步:查看结果

运行后得到的数据集会新增name_diff列,展示两列的字符串差异:

print(df_with_diff)
#> # A tibble: 3 × 4
#>      id name_old                name_new            name_diff          
#>   <int> <chr>                   <chr>               <chr>              
#> 1     1 apple, banana, orange   banana, orange, grape apple, grape       
#> 2     2 cat, dog                dog, rabbit         cat, rabbit        
#> 3     3 red, blue, green, yellow blue, purple        red, green, yellow, purple

按需调整差异逻辑

如果你不需要对称差异,而是只需要某一方向的差异:

  • 仅保留旧列有、新列没有的元素:把union(setdiff(.x, .y), setdiff(.y, .x))改成setdiff(.x, .y)
  • 仅保留新列有、旧列没有的元素:改成setdiff(.y, .x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:13:14