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