Более быстрое решение для функции R
Я пытаюсь создать "тепловую карту игрока во время матча". как то так ( http://i.imgur.com/pkdQFqH.jpg). У меня есть данные GPS в формате GPX, и я смог загрузить файл в R. Данные следующие:
lon lat ele time position sat
1 20.84293 15.82110 23.9 2016-03-28T17:28:19.407Z 1 3
2 20.84315 15.82129 23.9 2016-03-28T17:28:20.407Z 2 3
3 20.84309 15.82118 23.9 2016-03-28T17:28:22.407Z 3 3
4 20.84269 15.82089 23.9 2016-03-28T17:28:23.407Z 4 3
5 20.84277 15.82092 23.9 2016-03-28T17:28:24.407Z 5 3
6 20.84289 15.82102 23.9 2016-03-28T17:28:25.411Z 6 3
7 20.84306 15.82117 23.9 2016-03-28T17:28:27.411Z 7 3
8 20.84308 15.82115 23.9 2016-03-28T17:28:28.411Z 8 3
9 20.84292 15.82108 23.9 2016-03-28T17:28:29.411Z 9 3
10 20.84307 15.82124 23.9 2016-03-28T17:28:30.412Z 10 3
Для того, чтобы создать тепловую карту. Я решил измерить расстояние каждой точки до всех остальных точек в наборе данных и подсчитать все расстояния, которые меньше 5 м, или любое число. Затем использовал эту информацию для цветовой кодировки каждой точки. например, точки с большим количеством точек в пределах 5 м будут красными, затем оранжевыми, желтыми и т. д.
Чтобы измерить расстояние между всеми точками, я придумал эту функцию:
numberClosePoints=function(df,i,radius){
close_points=c()
while(i<=nrow(df)){ # looping while i <= the number of rows in the data frame
j = 1 # ... initializing j
count = 0 # count of distances for each i
while(j<=nrow(df)){# looping while j is < 5
dist=pointDistance(c(geodf$lon[i],geodf$lat[i]), c(geodf$lon[j],geodf$lat[j]),lonlat=T)
if (dist <= radius | is.nan(dist)){ # Add the is.nan because for some reason the distance between 5 and 5 was NaN and the function stops
count = count + 1
}
j = j + 1 # incrementing j
}
close_points <- c(close_points,count-1)
i = i + 1 # incrementing i
}
return(close_points)
}
Это работает просто отлично. Однако с большими наборами данных время выполнения вычислений увеличивается. Я могу подождать, в конце концов, в матче не так много очков ~3600 до 4000 (1 в секунду в течение 2 часов).
Мне было интересно, есть ли способ сделать это быстрее, или есть более эффективный способ сделать или карту тепла или функцию?