0

互いに非常に類似しているが、必ずしも完全に重複しているわけではないデータ フレーム内の行を特定したいと考えています。各行のすべてのデータを最後に 1 つの文字列セルにマージし、部分一致関数を使用することを検討しました。一致として認定するために必要な類似性のレベルを設定/調整できると便利です (たとえば、別の行の文字の 75% に一致するすべての行を返します)。

これは簡単な作業例です。

df<-data.frame(name = c("Andrew", "Andrem", "Adam", "Pamdrew"), id = c(12334, 12344, 34345, 98974), score = c(90, 90, 83, 95))

このシナリオでは、行 2 が行 1 の複製として表示されるようにしますが、行 4 は表示されないようにします (あまりにも似ていません)。提案をありがとう。

4

4 に答える 4

1

agrep(またはagrepl) を部分的な (あいまいな) パターン マッチングに使用できます。

> df[agrep("Andrew", df$name), ]
    name    id score
1 Andrew 12334    90
2 Andrem 12344    90

したがって、これは、「Andrew」に一致するときに行1と2の両方が見つかったことを示しています

> a <- agrep("Andrew", df$name)
> df[c(a[1], rownames(df)[-a]), ]
     name    id score
1  Andrew 12334    90
3    Adam 34345    83
4 Pamdrew 98974    95
于 2014-06-18T18:17:19.207 に答える
1

使用できますがagrep、最初の列だけでなく、すべての列であいまい検索を行うには、すべての列を連結する必要があります。

xx <- do.call(paste0,df)
df[agrep(xx[1],xx,max=0.6*nchar(xx[1])),]
     name    id score
1  Andrew 12334    90
2  Andrem 12344    90
4 Pamdrew 98974    95

0.7 の場合、すべての行が取得されることに注意してください。

行が一致したら、data.frame からそれらを抽出し、他の行に対して同じプロセスを繰り返す必要があります (ここでは行 3 と残りのデータ)...

于 2014-06-18T18:19:34.400 に答える
0

agstudy によって提供されるソリューションの拡張 (上記のコメントを参照) データ フレーム内の類似した各行が隣り合っているデータ フレームを生成する次のソリューションを作成しました。

df<-data.frame(name = c("Andrew", "Andrem", "Adam", "Pamdrew", "Adan"), id = c(12334, 12344, 34345, 98974, 34344), score = c(90, 90, 83, 95, 83))  
xx <- do.call(paste0,df)  ## concatenate all columns
df3<-df[0,] ## empty data frame for storing loop results
for (i in 1:nrow(df)){  ## produce results for each row of the data frame
df2<-df[agrep(xx[i],xx,max=0.3*nchar(xx[i])),] ##set level of similarity required (less than 30% dissimilarity in this case)
if(nrow(df2) >= 2){df3<-rbind(df3, df2)}  ## rows without matches returned themselves...this eliminates them
df3<-df3[!duplicated(df3), ]  ## store saved values in df3
}

これらの結果を生成するよりクリーンな方法があると確信していますが、これで問題は解決します。

于 2014-06-18T19:21:24.577 に答える
0

次のような名前には、おおよその文字列距離メトリックを使用できます。

adist(df$name)

     [,1] [,2] [,3] [,4]
[1,]    0    1    4    3
[2,]    1    0    3    4
[3,]    4    3    0    6
[4,]    3    4    6    0

または非類似行列計算を使用します。

require(cluster)
daisy(df[, c("id", "score")])

Dissimilarities :
      1     2     3
2    10            
3 22011 22001      
4 86640 86630 64629
于 2014-06-18T18:23:04.797 に答える