比较两列并识别R中的字符差异

时间:2016-03-31 00:37:14

标签: r character string-matching

我正在尝试编写一个程序来检查两列文本并识别单个错误。例如:

 1    2  
bat  bad  
tap  ta  
tap  tape  

我希望程序将第一列与第二列进行比较,并打印字符差异。

2 个答案:

答案 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" "" 

我不知道是否有任何默认功能来执行此操作...可能会有帮助...