2016-04-09 5 views
0

Моего набора данных выглядит следующим образом:Определение местоположения с помощью координат

ID   Start_Datetime  End_Datetime   Longitude Latitude 
2.011e+09 2011-02-01 00:47:35 2011-02-01 00:57:05 -73.98839 40.75504 

Я хочу, чтобы определить, если каждая строка произошла в одном из моих мест, представляющего интереса, например аэропорт. Для этого я делаю следующее:

tol <- 0.001 
for (i in 1:length(DataS$latitude)){ 
    if(abs(DataSet$latitude[i] - 40.644305) < tol | 
    abs(DataSet$latitude[i] - 40.642160) < tol) 
    if(abs(DataSet$longitude[i] - -73.790517) < tol | 
     abs(DataSet$longitude[i] - -73.788895) < tol) 
    { 
     DataSet$POI[i] <- 1 
    } 
} 

Мой набор данных имеет более чем 20 миллионов строк и этот код занимает много времени. Есть ли другой способ, которым я могу заставить это работать более эффективно? Может быть, функция в пакете ggmap, которую я адаптирую к этому?

Спасибо,

+0

Посмотрите на 'ifelse' – jaimedash

+0

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

+0

с помощью одной из функций apply-familiy. это должно быть намного быстрее, чем for-loop в R. – epo3

ответ

2

Попробуйте следующее решение: сравнение с использованием векторов и тест на основе центров прямоугольников вместо границы.

test_df <- data.frame(latitute = runif(n = 1000), longitude = runif(n = 1000)) 

tol <- 0.01 

lat1 <- 0.35 
lat2 <- 0.37 
long1 <- 0.64 
long2 <- 0.70 

lat12 <- (lat1 + lat2)/2 
tol1 <- tol + abs(lat2 - lat1)/2 

long12 <- (long1 + long2)/2 
tol2 <- tol + abs(long2 - long1)/2 


test_df$POI <- abs(test_df$latitute - lat12) < tol1 & 
    abs(test_df$longitude - long12) < tol2 
+0

Это намного более быстрый вариант. Благодаря! – Estefy