使用R来比较两个单词,并找到第二个单词的唯一字母(约6000个案例)



我有一个由两列单词组成的数据帧。对于每一行,我想识别只出现在第二列单词中的任何字母,例如

carpet    carpelt        #return 'l'
bag       flag           #return 'f' & 'l'
dog       dig            #return 'i'

我想使用R来自动执行此操作,因为我有6126行。

作为一个R新手,到目前为止我得到的最好的是这个,它给了我两个单词中唯一的字母(显然非常笨拙(:

x<-(strsplit("carpet", ""))
y<-(strsplit("carpelt", ""))
z<-list(l1=x, l2=y)
unique(unlist(z))

任何帮助都将不胜感激。

您要搜索的函数是setdiff:

chars_for = function (str)
    strsplit(str, '')[[1]]
result = setdiff(chars_for(word2), chars_for(word1))

(注意setdiff中自变量的颠倒顺序。(

将其应用于整个data.frame,称为x:

apply(x, 1, function (words) setdiff(chars_for(words[2]), chars_for(words[1])))

使用正则表达式:(用括号[]粘贴单词,然后对正则表达式使用替换函数。这个正则表达式从括号中查找任何字母,并将其替换为空字符串(可以说它"删除"了这些字母(。

require(stringi)
x <- c("carpet","bag","dog")
y <- c("carplet", "flag", "smog")
pattern <- stri_paste("[",x,"]")
pattern
## [1] "[carpet]" "[bag]"    "[dog]"   
stri_replace_all_regex(y, pattern, "")
## [1] "l"  "fl" "sm"
x <- c("carpet","bag","dog")
y <- c("carpelt", "flag", "dig")

按照strsplit的要求,你可以进行

> sx <- strsplit(x, "")
> sy <- strsplit(y, "")
> lapply(seq_along(sx), function(i) sy[[i]][ !sy[[i]] %in% sx[[i]] ])
#[[1]]
#[1] "l"
#
#[[2]]
#[1] "f" "l"
#
#[[3]]
#[1] "i"

这使用%in%y中的字符与x中的字符进行逻辑匹配。我否定了与!的匹配,以确定那些在y中但不在x中的字符。

最新更新