Rを使用して、年と都市で構造化されたデータセット内の人の名前を照合しようとしています。いくつかのスペルミスのため、完全一致は不可能です。そのため、agrep()を使用して名前をあいまい一致させようとしています。
データセットのサンプルチャンクは次のように構成されています。
df <- data.frame(matrix( c("1200013","1200013","1200013","1200013","1200013","1200013","1200013","1200013", "1996","1996","1996","1996","2000","2000","2004","2004","AGUSTINHO FORTUNATO FILHO","ANTONIO PEREIRA NETO","FERNANDO JOSE DA COSTA","PAULO CEZAR FERREIRA DE ARAUJO","PAULO CESAR FERREIRA DE ARAUJO","SEBASTIAO BOCALOM RODRIGUES","JOAO DE ALMEIDA","PAULO CESAR FERREIRA DE ARAUJO"), ncol=3,dimnames=list(seq(1:8),c("citycode","year","candidate")) ))
きちんとしたバージョン:
citycode year candidate
1 1200013 1996 AGUSTINHO FORTUNATO FILHO
2 1200013 1996 ANTONIO PEREIRA NETO
3 1200013 1996 FERNANDO JOSE DA COSTA
4 1200013 1996 PAULO CEZAR FERREIRA DE ARAUJO
5 1200013 2000 PAULO CESAR FERREIRA DE ARAUJO
6 1200013 2000 SEBASTIAO BOCALOM RODRIGUES
7 1200013 2004 JOAO DE ALMEIDA
8 1200013 2004 PAULO CESAR FERREIRA DE ARAUJO
数年後に候補者が出てくるかどうか、各都市で個別にチェックしたいと思います。たとえば、例では、
PAULO CEZAR FERREIRA DE ARAUJO
PAULO CESAR FERREIRA DE ARAUJO
2回表示されます(スペルミスあり)。データセット全体の各候補には、一意の数値候補IDを割り当てる必要があります。データセットはかなり大きいため(5500の都市、約100Kのエントリ)、ある程度効率的なコーディングが役立ちます。これを実装する方法について何か提案はありますか?
編集:これが私の試みです(これまでのコメントの助けを借りて)、手元のタスクを達成するのに非常に遅い(非効率的)です。これに対する改善について何か提案はありますか?
f <- function(x) {matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
x
}
temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)
編集2:今は良い速度で実行されています。問題は、すべてのステップでの多くの要因との比較でした(それを指摘してくれてありがとう、BlueMagister)。1つのグループ(つまり都市)の候補者のみとの比較を減らすと、5秒で80,000回線のコマンドが実行されます。これは私が住むことができる速度です。
df$candidate <- as.character(df$candidate)
f <- function(x) {x <- as.factor(x)
matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
as.character(x)
}
temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)