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

R语言如何实现两个字符串相减 解决str_remove函数失效问题

问题原因定位

你之前写的代码没生效是两个错误导致的:

  • 你给str_remove传的第二个参数是带引号的"string_2",这是一个固定的字面文本,不是你存了字符串向量的string_2变量,R会尝试在string_1里找完全匹配"string_2"的内容,当然什么都匹配不到,原字符串不会有任何改动。
  • 就算你去掉引号传入string_2向量,str_remove默认会尝试把string_2的整行内容(比如第一行是"123 red")从string_1里匹配删除,但string_1里根本没有"red""blue""green"这些内容,整串匹配失败,还是不会产生删除效果。
正确实现方法

你的需求本质是逐行把两个字符串按空格拆成独立词条,删除string_1里和同位置string_2重复的词条,再把剩下的内容拼回来,直接按这个逻辑写就行。

tidyverse 写法

library(tidyverse)

my_data %>%
  mutate(
    result = map2_chr(
      string_1, string_2,
      ~{
        words_s1 <- str_split(.x, "\\s+")[[1]]
        words_s2 <- str_split(.y, "\\s+")[[1]]
        paste(setdiff(words_s1, words_s2), collapse = " ")
      }
    )
  )

运行后result列的输出就是你要的"newyork" "california" "washington"。

基础R写法

不需要额外装包也能实现:

mapply(
  function(s1, s2) {
    w1 <- unlist(strsplit(s1, "\\s+"))
    w2 <- unlist(strsplit(s2, "\\s+"))
    paste(setdiff(w1, w2), collapse = " ")
  },
  my_data$string_1,
  my_data$string_2
)
关于是否需要用ANTI JOIN

完全不需要。
ANTI JOIN是表级别的行筛选操作,作用是返回左表中无法和右表通过指定键匹配上的整行数据,本质是对数据框的行做过滤,和你现在要做的「单条字符串内部删内容」的需求完全不匹配,没必要硬套。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:54:21