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
相关产品推荐
相关产品推荐

