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

У меня есть фрейм данных с позициями, где у шины была нулевая скорость (стоя на месте).Я хочу определить, связано ли это с условиями дорожного движения или потому что он остановился на автобусной остановке.У меня есть функция, которая рассчитывает расстояние от центра автобусной остановки до любой другой позиции (функция называется in_circle).Если автобус остановился в 20 метрах от центра автобусной остановки, я устанавливаю stop_type в 1 и перехожу к следующей точке, в которой автобус остановился.

Приведенный ниже код работает, но у меня большой объем данных, и два цикла for работают довольно долго.Поэтому мне интересно, есть ли более эффективный способ написания приведенного ниже кода.

Редактировать: я добавил изображение из нескольких строк данных.https://i.stack.imgur.com/Ekvqv.png

k=1
for(i in 1:NROW(df_bus_h_z)){
  # Save current longitude and latitude of the bus
  cur_lat <- df_bus_h_z[i, "latitude"]
  cur_lon <- df_bus_h_z[i, "longitude"]
  # Controll boolean
  stop_found = FALSE 
  #Search trough all bus stops
  for(j in 1:NROW(df_stop_all)){
    if(df_stop_all[j,"trip_id"] == cur_trip){
      # If the bus stopped at a bus stop
      if(in_circle(df_stop_all[j,"stop_lat"],df_stop_all[j,"stop_lon"], cur_lat, cur_lon) <= 20){
        df_bus_h_z[i, "stop_type"] <- 1
        df_bus_h_z[i, "stop_id"] <- df_stop_all[j,"stop_id"]
        stop_found = TRUE
        break
      }
    }
  }
  if(stop_found == FALSE){
    df_bus_h_z$stop_type[i] <- 0
  }
}

Ответы [ 2 ]

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

Я решил это с помощью функции geo_join.Спасибо за помощь!

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

Рассмотрите возможность объединения двух наборов данных, которые часто являются векторизованным аналогом вложенных циклов for между двумя наборами данных.Затем запустите ifelse, который зависит от возврата неизвестного метода, in_circle.

Обратите внимание, что ниже не протестировано без воспроизводимого примера и желаемых результатов.Если необходимо сохранить все записи в любом наборе, настройте аргумент all в ?merge.Кроме того, при необходимости измените поля объединения в аргументах by или by.x / by.y.

mdf <- merge(df_bus_h_z, df_stop_all, by="trip_id")      # MAYBE SUBSET BY UNKNOWN cur_trip?

mdf <- within(mdf, {
           cond <- in_circle(stop_lat, stop_lon, latitude, longitude) <= 20

           stop_type <- ifelse(cond, 1, 0)               # NEW COLUMN
           bus_stop_id <- ifelse(cond, stop_id, NA)      # NEW COLUMN (POSSIBLY REDUNDANT)
       })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...