名前がさまざまな形式である会社名の文字ベクトルを想定します。これは、10,000 行のデータ フレームの小さなバージョンです。目的の 2 番目のベクトル ("two.names") が表示されます。
structure(list(firm = structure(1:8, .Label = c("Carlson Caspers",
"Carlson Caspers Lindquist & Schuman P.A", "Carlson Caspers Vandenburgh Lindquist & Schuman P.A.",
"Carlson Caspers Vandenburgh & Lindquist", "Carmody Torrance",
"Carmody Torrance et al", "Carmody Torrance Sandak", "Carmody Torrance Sandak & Hennessey LLP"
), class = "factor"), two.name = structure(c(1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L), .Label = c("Carlson Caspers", "Carmody Torrance"
), class = "factor")), .Names = c("firm", "two.name"), row.names = c(NA,
-8L), class = "data.frame")
firm two.name
1 Carlson Caspers Carlson Caspers
2 Carlson Caspers Lindquist & Schuman P.A Carlson Caspers
3 Carlson Caspers Vandenburgh Lindquist & Schuman P.A. Carlson Caspers
4 Carlson Caspers Vandenburgh & Lindquist Carlson Caspers
5 Carmody Torrance Carmody Torrance
6 Carmody Torrance et al Carmody Torrance
7 Carmody Torrance Sandak Carmody Torrance
8 Carmody Torrance Sandak & Hennessey LLP Carmody Torrance
ベクトルが会社名のアルファベット順にソートされていると仮定します (これにより、最も短いバージョンが最初に表示されると思います)。agrep()
最初の会社名から始めて、それを 2 番目の会社名と一致させ、そして (ほぼ一致すると仮定して) 最初の会社名を両方の新しい列 (short.name) に追加するにはどうすればよいでしょうか。次に、それを 3 番目の要素と一致させます。すべての Carlson バリエーションが一致します。
R が最初の Carmody に遭遇したときのように、十分な一致がない場合は、最初からやり直して次の要素に一致し、次の不一致まで繰り返します。
連続する企業間に一致がない場合、R は一致が見つかるまで続行する必要があります。
この質問に対する答えは、ベクトル全体と年ごとのグループに対してファジー マッチングを使用します。 名前のあいまい一致によって一意の ID を作成します (R を使用した agrep 経由) 。しかし、私の問題を解決するコードの一部を提供しているようです。この質問ではstringdist()
. 文字列距離
編集:
以下、オブジェクトmatches
は一致を示すリストですが、R に「最初の一致を取り、次の一致があればその名前に変換し、その名前を新しい変数列に入れる」ように指示するコードがわかりません。 "
as.factor(df$firm)
matches <- lapply(levels(df$firm), agrep, x=levels(df$firm), fixed=TRUE, value=FALSE)