Как зациклить проверку строки между двумя фреймами данных в R? - PullRequest
0 голосов
/ 08 июля 2019

Я хочу зациклить некоторый код, который проверяет широту и долготу одной строки df1 по всем строкам широты и долготы df2 для их расстояния, а затем отфильтровать эти расстояния менее 500. Я хочу затем отброситьперейти к следующему ряду df1 и выполнить ту же задачу.

Я могу добиться этого для первого ряда, но мне не удалось его зациклить.

Я попытался обернуть его в функцию цикла:

for (i in nrow(df3$value)){ 
df <- df2 %>% 
  filter(distHaversine(c(Longitude, Latitude), c(df3$Longitude[i], df3$Latitude[i])) <= 500)

df <- data.frame(df, df3$value[i])

}

, но это не удалось.

Приведенный ниже код возвращается при копировании в консоль и возвращает правильную информацию для 1 строки df3.Я хочу быть в состоянии запустить его против всех 75 строк df3.

df <- df2 %>% 
  filter(distHaversine(c(Longitude, Latitude), c(df3$Longitude[1], df3$Latitude[1])) <= 500)

df <- data.frame(df, df3$value[1])

1 Ответ

0 голосов
/ 08 июля 2019

Во-первых, я рекомендую прочитать этот вопрос и ответ о воспроизводимых примерах для написания ваших будущих вопросов.Например, я не знаю, какой пакет вы используете для функции distHaversine, поэтому не могу быть уверен в ее аргументах.Чем проще вам будет ответить на ваш вопрос, тем больше вероятность, что вы получите нужный вам ответ.

В вашем цикле вызова for есть пара ошибок:

  • Вам нужно использовать число последовательность для циклического перебора, ни одно число
  • nrow() не используется для двумерных массивов, таких как матрицы или кадры данных.Для вектора типа df3$value вы должны использовать length().Предполагая, что df3 является объектом data.frame, вы можете легко проверить, что nrow(df3$value) возвращает NULL.

Итак, ваша проблема более проста: вызов цикла for даже не выполняется.Вот почему ваш второй блок кода дает вам желаемый результат, а первый - нет.

for(i in 1:nrow(df3)) { }

# or

for(i in 1:length(df3$x)) { }

# or (maybe better)

for(i in seq_along(df3$value)) { }

Но, я думаю, вам следует избегать использования циклов for при написании кода R.В этом нет ничего плохого, но вы должны злоупотреблять функциональным программированием R и векторизованными решениями для краткого и эффективного кода.

Например, вы можете написать функцию, основанную на втором коде, и объединить ее с lapplyфункция или purrr семейство пакетов map (в данном случае purrr::map_dfr()).Я настоятельно рекомендую привыкнуть к последнему, так как он намного надежнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...