0

名前がさまざまな形式である会社名の文字ベクトルを想定します。これは、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)
4

1 に答える 1

0

最初に最初の行を short.name として定義してから、一致するものを見つけ、データフレームを更新して、次に探すものを選びます。それが、「ワンライナーでこれを解決しようとしないでください」という意味です。何が起こっているのかを理解できるように、最初にもっと冗長な方法で機能させる必要があります。次に、必要な場合にのみ、それをワンライナーに圧縮してみてください。

firm.txt <- as.character(df$firm)
short.name <- firm.txt[1]
for (i in 2:length(firm.txt)) {
  # i don't know how to write it any prettier
  match <- agrep(short.name, firm.txt)
  if (length(match) > 0) {
    df$two.name[match] <- short.name
    i <- max(match) + 1
    short.name <- firm.txt[i]
  }
}
于 2015-01-22T09:59:27.747 に答える