Более быстрое решение для функции 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 часов).

Мне было интересно, есть ли способ сделать это быстрее, или есть более эффективный способ сделать или карту тепла или функцию?

0 ответов

Другие вопросы по тегам