Скажем, у меня есть список округов с различным количеством орфографических ошибок или других проблем, которые их отличает от 2010 FIPS dataset (код для создания fips
dataframe ниже), но состояния, в которых находятся языки с ошибками, введены правильно. Вот такие sample
из 21 случайных наблюдений из моих полного набора данных:R: Использование plyr для выполнения нечеткой строки, совпадающей между сопоставимыми подмножествами двух источников данных
tomatch <- structure(list(county = c("Beauregard", "De Soto", "Dekalb", "Webster",
"Saint Joseph", "West Feliciana", "Ketchikan Gateway", "Evangeline",
"Richmond City", "Saint Mary", "Saint Louis City", "Mclean",
"Union", "Bienville", "Covington City", "Martinsville City",
"Claiborne", "King And Queen", "Mclean", "Mcminn", "Prince Georges"
), state = c("LA", "LA", "GA", "LA", "IN", "LA", "AK", "LA", "VA",
"LA", "MO", "KY", "LA", "LA", "VA", "VA", "LA", "VA", "ND", "TN",
"MD")), .Names = c("county", "state"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -21L))
county state
1 Beauregard LA
2 De Soto LA
3 Dekalb GA
4 Webster LA
5 Saint Joseph IN
6 West Feliciana LA
7 Ketchikan Gateway AK
8 Evangeline LA
9 Richmond City VA
10 Saint Mary LA
11 Saint Louis City MO
12 Mclean KY
13 Union LA
14 Bienville LA
15 Covington City VA
16 Martinsville City VA
17 Claiborne LA
18 King And Queen VA
19 Mclean ND
20 Mcminn TN
21 Prince Georges MD
Я использовал adist
создать нечеткий алгоритм сопоставления строки, которая соответствует около 80% моих графств к именам графств в fips
. Однако иногда он будет совпадать с двумя графствами с похожим написанием, но из разных состояний (например, «Вебстер, Лос-Анджелес» сопоставляется с «Вебстером, штат Джорджия», а не с «Вебстер Пэрриш, Лос-Анджелес»).
distance <- adist(tomatch$county,
fips$countyname,
partial = TRUE)
min.name <- apply(distance, 1, min)
matchedcounties <- NULL
for(i in 1:nrow(distance)) {
s2.i <- match(min.name[i], distance[i, ])
s1.i <- i
matchedcounties <- rbind(data.frame(s2.i = s2.i,
s1.i = s1.i,
s1name = tomatch[s1.i, ]$county,
s2name = fips[s2.i, ]$countyname,
adist = min.name[i]),
matchedcounties)
}
Поэтому я хочу, чтобы ограничить нечеткое соответствие строки округа к буквам правильно версиям с соответствием состояния.
Мой текущий алгоритм делает одну большую матрицу, которая вычисляет стандартные расстояния Левенштейна между обоими источниками и затем выбирает значение с минимальным расстоянием.
Чтобы решить мою проблему, я предполагаю, что мне нужно будет создать функцию, которая может быть применена к каждой группе состояний на ddply
, но я смущен относительно того, как я должен указать, что значение группы в функция ddply
должна соответствовать другому кадру данных. Также будет оценено решение или решение dplyr
с использованием любого другого пакета.
код для создания FIPS набора данных:
download.file('http://www2.census.gov/geo/docs/reference/codes/files/national_county.txt',
'./nationalfips.txt')
fips <- read.csv('./nationalfips.txt',
stringsAsFactors = FALSE, colClasses = 'character', header = FALSE)
names(fips) <- c('state', 'statefips', 'countyfips', 'countyname', 'classfips')
# remove 'County' from countyname
fips$countyname <- sub('County', '', fips$countyname, fixed = TRUE)
fips$countyname <- stringr::str_trim(fips$countyname)
Ваш вопрос очень сильно выиграет от [воспроизводимого примера] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – MrFlick