检测字符串向量差异:为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
相关产品推荐
相关产品推荐

