R 匹配相似字符串向量并返回不匹配元素

R 匹配相似字符串向量并返回不匹配元素,r,string,R,String,我有两个包含类似字符串向量(产品标题)的数据集。两个数据集中字符串之间的唯一区别是缺少/存在特殊字符 现在,我的问题是匹配相应的字符串向量并返回不匹配的元素(在每种情况下都应该是特殊字符)。单个字符串中可以有许多不匹配的特殊字符 例如,我有两个文本: Text 1: Analog Science Fiction and Fact February 1995 Text 2: Analog Science Fiction and Fact, February 1995 是否存在仅返回不匹配元素的R

我有两个包含类似字符串向量(产品标题)的数据集。两个数据集中字符串之间的唯一区别是缺少/存在特殊字符

现在,我的问题是匹配相应的字符串向量并返回不匹配的元素(在每种情况下都应该是特殊字符)。单个字符串中可以有许多不匹配的特殊字符

例如,我有两个文本:

Text 1: Analog Science Fiction and Fact February 1995
Text 2: Analog Science Fiction and Fact, February 1995
是否存在仅返回不匹配元素的R函数

我就是这样处理这个问题的

S.vector <- strsplit(Acceptdata['Text.1'][1,],' ')
S.vector
# [[1]]
# [1] "Analog"   "Science"  "Fiction"  "and"      "Fact"     "February" "1995"    

F.vector <- strsplit(Acceptdata['Text.2'][1,],' ')
F.vector
# [[1]]
# [1] "Analog"   "Science"  "Fiction"  "and"      "Fact,"    "February" "1995"

l.S.vector <- tolower(S.vector)
l.F.vector <- tolower(F.vector)
grep("l.S.vector",l.F.vector,invert=T,value=T)
# [1] "c(\"analog\", \"science\", \"fiction\", \"and\", \"fact,\", \"february\", \"1995\")"

S.vector我完全清楚您的预期输出,但我认为这将帮助您实现目标。它使用来自qualV包的
LCS
功能

library("qualV")
common <- function(a,b) {
    a2 <- strsplit(a,'')[[1]]
    b2 <- strsplit(b,'')[[1]]
    if(length(a2) < length(b2)) {
        a2[(length(a2)+1):length(b2)] <- ' '
    } else if(length(a2) > length(b2)) {
        b2[(length(b2)+1):length(a2)] <- ' '
    }
    LCS(a2,b2)
}
库(“qualV”)

非常感谢你详尽的答复。不幸的是,我收到了错误消息z$f[其中(!seq(1,max(z$vf))%in%z$vf)]seq中的错误。默认值(1,max(z$vf)):“to”不能是NA、NaN或无限。另外:警告消息:in max(z$vf):max没有不丢失的参数;返回-inf此外,我还得到了粘贴(z$LCS,collapse='')[1]“AnalogScienceFrievenandFebruary1995”与您对公共字符串的结果不同(“事实”和“事实”,因为它们在两个字符串中都不常见)。
f
不是
LCS
返回值的元素。查看
str(z)
以了解可以提取哪些元素。在
LCS
返回值中,向量总是被称为
a
b
。对于第二个问题,您使用什么作为
common
的输入来获得该结果?我将字符串命名为“s”和“f”。那么,我必须将它们重命名为“a”和“b”吗?对于第二个问题,我使用的是您调用的确切函数,只是我重命名了字符串。对于
-循环,您的
周围需要
{}
括号。例如,
for(i在seq_中沿着(a)){for(j在seq_中沿着(b)){…}
。在循环中
i
是一个数字(即,数字序列中从1到对象
a
和对象
b
长度的位置)。因此,
strsplit(tolower(i))
类似于循环每次迭代时的
strsplit(tolower(1))
strsplit(tolower(2))
,等等。您可能需要这样的内容:
strsplit(tolower(a[i]))
library("qualV")
common <- function(a,b) {
    a2 <- strsplit(a,'')[[1]]
    b2 <- strsplit(b,'')[[1]]
    if(length(a2) < length(b2)) {
        a2[(length(a2)+1):length(b2)] <- ' '
    } else if(length(a2) > length(b2)) {
        b2[(length(b2)+1):length(a2)] <- ' '
    }
    LCS(a2,b2)
}
a <- 'Analog Science Fiction and Fact February 1995'
b <- 'Analog Science Fiction and Fact, February 1995'
z <- common(a,b)
paste0(z$LCS, collapse = '') # common string
# [1] "Analog Science Fiction and Fact February 1995"
z$b[which(!seq(1,max(z$vb)) %in% z$vb)] # non-matching elements in `b`
# [1] ","
z$a[which(!seq(1,max(z$va)) %in% z$va)] # non-matching elements in `a`
# character(0)
a <- 'Analog! SCIENCE Fiction and Fact Feb. 1995'
b <- 'Analog Science Fiction & Fact (February 1995)'
z <- common(a,b)
paste0(z$LCS, collapse = '') # common string
# [1] "Analog S Fiction  Fact Feb 1995"
z$b[which(!seq(1,max(z$vb)) %in% z$vb)] # non-matching elements in `b`
# [1] "c" "i" "e" "n" "c" "e" "&" "(" "r" "u" "a" "r" "y"
z$a[which(!seq(1,max(z$va)) %in% z$va)] # non-matching elements in `a`
# [1] "!" "C" "I" "E" "N" "C" "E" "a" "n" "d" "."