R: ускорение для цикла, содержащего который - PullRequest
0 голосов
/ 23 мая 2019

У меня есть два фрейма данных - один содержит набор почтовых индексов и присвоенных им опросов (df1), другой содержит все возможные почтовые индексы и зоны, в которых они содержатся (df2). По сути, мне нужно удалить почтовые индексы и распределить каждый опрос по зоне (используя почтовые индексы для перекрестных ссылок). В настоящее время я рассчитываю, что моя программа займет 5 часов. как я могу ускорить это?

for (i in 1:nrows(df1)) {
    index <- which(df2$postcodes == toString(df1$postcodes[i])
    if (length(index)) {
        df1$zone <- toString(df2[index])
    } else {
        df1$zone <- 'UNMATCHED'
    }
} 

В настоящее время я обнаружил, что запуск 100 почтовых индексов занимает около 6 секунд.

За последние пару часов я попробовал кучу вещей с небольшим прогрессом или без него, поэтому любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 23 мая 2019

Это звучит как внутреннее соединение, которое может быть достигнуто с помощью dplyr. И вы можете опустить столбец postcodes после. Вот хороший шпаргалка: http://stat545.com/bit001_dplyr-cheatsheet.html

inner_join (x, y): возвращает все строки из x, где есть совпадающие значения в y, и все столбцы из x и y. Если есть несколько совпадения между x и y, возвращаются все комбинации совпадений. Это мутирующее соединение.

...