Как преобразовать цикл, чтобы применить семейную функцию для эффективности? - PullRequest
0 голосов
/ 19 февраля 2019

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

for(i in 1:nrow(Current_Month){
    d = distm(c(90, 90), c(Current_Month$Lon[i], Current_Month$Lat[i]), fun=distHaversine)
    Current_Month$Nearby[i] = ifelse(d < 1000, 1, d)
}

1 Ответ

0 голосов
/ 19 февраля 2019

Как сказал Маркус:

На самом деле вам не нужно циклически проходить через Current_Month - data.frame.

Функция distm - также принимает матрицу (или данные.frame) с двумя столбцами.

Это сработало для меня с небольшими фиктивными выборочными данными.

Current_Month <- data.frame("Lon" = sample(1:100, 1000, replace = TRUE),
                            "Lat" = sample(1:90, 1000, replace = TRUE))

start <- Sys.time() 
d = distm(c(90, 90), Current_Month, fun=distHaversine)
end <- Sys.time()
end - start
> Time difference of 0.001993895 secs

In contrast to your:

start <- Sys.time()
for(i in 1:nrow(Current_Month)){
  d = distm(c(90, 90), c(Current_Month$Lon[i], Current_Month$Lat[i]),
      fun=distHaversine)
 }
end <- Sys.time()
end - start
Time difference of 0.2293599 secs

Так что это значительно быстрее.

Затем выполните:

Current_Month$Nearby = t(ifelse(d < 1000, 1, d)) #had to transpose this one though

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