2つのテキスト列を調べ、単一のエラーを特定するプログラムを作成しようとしています。たとえば:2つの列を比較して文字の違いを識別するR
1 2
bat bad
tap ta
tap tape
私はプログラムが列2に対して列1を比較すると、文字の違いを印刷したいと思います。
2つのテキスト列を調べ、単一のエラーを特定するプログラムを作成しようとしています。たとえば:2つの列を比較して文字の違いを識別するR
1 2
bat bad
tap ta
tap tape
私はプログラムが列2に対して列1を比較すると、文字の違いを印刷したいと思います。
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
01に相当する、レーベンシュタイン距離を使用し上記の方法。これはおそらくあなたが望む方法でしょう。
異なる距離の方法については、this web pageを参照してください。
ここはコードですが、これはあなたが期待していると思います。これを行うには、任意のデフォルトの関数がある場合、私は知らない
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" ""
...これは参考になるかもしれ...
は、まずあなたのコードの一部を追加します。 http://stackoverflow.com/help/how-to-ask –
'?agrep'と'?adist'を参照してください。 – thelatemail