我正在尝试编写一个程序来检查两列文本并识别单个错误。例如:
1 2
bat bad
tap ta
tap tape
我希望程序将第一列与第二列进行比较,并打印字符差异。
答案 0 :(得分:3)
这是使用stringdist
包的方法。
# Your data sample, plus a couple of extra rows
dat = data.frame(x=c(1,'bat','tap','tap','tapes','tapped'),
y=c(2,'bad','ta','tape','tapes','tapas'))
dat
x y
1 1 2
2 bat bad
3 tap ta
4 tap tape
5 tapes tapes
6 tapped tapas
library(stringdist)
# Distance methods available in stringdist
dist.methods = c("osa", "lv", "dl", "hamming", "lcs", "qgram",
"cosine", "jaccard", "jw", "soundex")
# Try all the methods with the sample data
sapply(dist.methods, function(m) stringdist(dat[,1],dat[,2], method=m))
osa lv dl hamming lcs qgram cosine jaccard jw soundex [1,] 1 1 1 1 2 2 1.0000000 1.0000000 1.00000000 1 [2,] 1 1 1 1 2 2 0.3333333 0.5000000 0.22222222 0 [3,] 1 1 1 Inf 1 1 0.1835034 0.3333333 0.11111111 1 [4,] 1 1 1 Inf 1 1 0.1339746 0.2500000 0.08333333 0 [5,] 0 0 0 0 0 0 0.0000000 0.0000000 0.00000000 0 [6,] 3 3 3 Inf 5 5 0.3318469 0.5000000 0.30000000 1
或者,使用adist
,正如@thelatemail所建议的那样:
apply(dat, 1, function(d) adist(d[1], d[2]))
[1] 1 1 1 1 0 3
adist
使用Levenshtein距离,相当于上面的lv
方法。这可能就是你想要的方法。
有关不同距离方法的说明,请参阅this web page。
答案 1 :(得分:1)
这是代码,我认为这是你期待的。
df
one two
bat bad
tap ta
tap tape
getDiff<-function(dataframe){
result<-" "
for(i in 1:nrow(dataframe))
str1<-unlist(strsplit(dataframe[i,"one"],split = ""))
str2<-unlist(strsplit(dataframe[i,"two"],split = ""))
for(j in 1:length(str1)){
if(j <= length(str2) & str1[j] == str2[j]){
retstr<-str1[(j+1):length(str1)]
}else{
break
}
}
result[i]<-paste(retstr,collapse = "")
}
return(result)
}
getDiff(df)
results:
"t" "p" ""
我不知道是否有任何默认功能来执行此操作...可能会有帮助...