我们说我有一个包含以下单词的变量
ChicKen120
Chicken1.20
Chicken(1.20)
Cow
cow.
cow/
cat
我意识到我能做到
grep("chicken", df$words, ignore.case=T)
找到与鸡肉相似的所有单词,但是通过每个单词来处理这个单词会很乏味,即第一只鸡,然后是牛,然后是猫......
有没有办法在整栏中找到相似的单词?
我想将类似的单词转换为一种标准格式,
chicken(1.20)
chicken(1.20)
chicken(1.20)
cow
cow
cow
cat
答案 0 :(得分:5)
关于您的第一个问题,您可以尝试使用adist()
:
text <- c("ChicKen120","Chicken1.20","Chicken(1.20)","Cow","cow.", "cow/")
> adist(text)
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 0 2 4 9 9 9
#[2,] 2 0 2 10 9 10
#[3,] 4 2 0 12 11 12
#[4,] 9 10 12 0 2 2
#[5,] 9 9 11 2 0 1
#[6,] 9 10 12 2 1 0
具有2个或更少连接对的六个字的矩阵元素,最多相差2个字符。
更具体地说,可以列出不相同且最多相差两个字符的单词对:
which(adist(text)<=2 & upper.tri(adist(text)), arr.ind=T)
# row col
#[1,] 1 2
#[2,] 2 3
#[3,] 4 5
#[4,] 4 6
#[5,] 5 6
这里逻辑函数upper.tri()
已被用于仅选择矩阵的上三角形,从而防止对的双输出(即,以相反的顺序重复)并去除对角线上的相同对。
可以像这样检索与上面列出的行号和列号对应的单词:
words <- text[which(adist(text)<=2 & upper.tri(adist(text)), arr.ind=T)]
matrix(words,ncol=2)
# [,1] [,2]
#[1,] "ChicKen120" "Chicken1.20"
#[2,] "Chicken1.20" "Chicken(1.20)"
#[3,] "Cow" "cow."
#[4,] "Cow" "cow/"
#[5,] "cow." "cow/"
答案 1 :(得分:1)
考虑一个嵌套的gsub,删除所有不需要的特殊字符,并保留单词stem甚至全部移动到小写。下面删除了正斜杠和反斜杠,句点和括号(如果需要将其他模式合并到模式参数中并使用管道分隔符分隔):
df$newvar <- gsub(pattern = '([[:upper:]])', perl = TRUE,
replacement = '\\L\\1', gsub('[/|\\\\|\\.()]','', df$var))
由此,使用另一个gsub()
来处理其他所需的模式,用户必须根据这些模式决定您的需求和数据。 R很难从(1.20)
值120
和1.20
知道你想要df$newvar <- gsub('120','(1.20)', df$newvar)
:
var newvar
1 ChicKen120 chicken(1.20)
2 Chicken1.20 chicken(1.20)
3 Chicken(1.20) chicken(1.20)
4 Cow cow
5 cow. cow
6 cow/ cow
7 cat cat
8 cat\ cat #<---- ADDED FOR DEMO
<强>观察强>
{{1}}