получить наиболее распространенные траектории источника-назначения в R

У меня есть два набора данных пространственных точек, один для источников и один для пунктов назначения.

Я хотел бы взять наиболее повторяющиеся траектории из этих координат.

> salidas
class       : SpatialPointsDataFrame 
features    : 4385 
extent      : -8.694846, -8.339238, 41.00827, 41.25749  (xmin, xmax, ymin, ymax)
crs         : +init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 3
names       :               cod, duracion, franja_h 
min values  : 1.37263685362e+18,      315,        1 
max values  : 1.37274729362e+18,    13830,       96 

> llegadas
class       : SpatialPointsDataFrame 
features    : 4385 
extent      : -8.756604, -7.739523, 40.48858, 41.4262  (xmin, xmax, ymin, ymax)
crs         : +init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 3
names       :               cod, duracion, franja_h 
min values  : 1.37263685362e+18,      315,        1 
max values  : 1.37274729362e+18,    13830,       96 

Я думаю, что точки должны быть осторожными, так как они не слишком специфичны и не дают слишком много информации, поэтому я сделал для них сетку координат X и Y.

> GridSalidas
          X       Y Count
1   -8.3375 41.1975     1
2   -8.5125 41.2025     1
3   -8.5325 41.1425     1
4   -8.5325 41.2075     1
5   -8.5325 41.2225     1
6   -8.5475 41.2025     1
7   -8.5475 41.2075     1
8   -8.5475 41.2325     1
9   -8.5525 41.2075     1
10  -8.5525 41.2175     1

> GridLlegadas
          X       Y Count
1   -7.7375 41.2975     1
2   -7.8625 40.4875     1
3   -8.1475 41.1875     1
4   -8.3075 41.1975     1
5   -8.4725 41.3225     1
6   -8.4875 41.1875     1
7   -8.4925 41.1925     1
8   -8.4975 41.1875     2
9   -8.5025 41.0425     1
10  -8.5025 41.1925     1

В результате хотелось бы выяснить, какие траектории более распространены в зависимости от пункта отправления и пункта назначения.

Спасибо!


person Ander Jarauta Álvarez    schedule 18.04.2020    source источник
comment
Что вы имеете в виду, когда говорите повторяющаяся траектория? Должны ли они иметь точно такое же место отправления и назначения? Или только относительные позиции? Кроме того, есть примеры фреймов данных?   -  person Matthew Hui    schedule 18.04.2020
comment
Под частой траекторией я подразумеваю траектории, которые наиболее часто повторяются во фрейме данных, так что можно визуализировать только самые распространенные. не обязательно иметь точное начало или место назначения, так как оно слишком конкретное, но чего я хочу добиться, так это увидеть, какие из них наиболее повторяются, поэтому я использую сетку, поскольку точка слишком конкретна.   -  person Ander Jarauta Álvarez    schedule 18.04.2020
comment
Я имею в виду, например, Original = (-7.5, 40), destination = (-8.5, 42) та же траектория, что и Original = (-6.5, 39), destination = (-7.5, 41)? Поскольку оба имеют одинаковые смещения x и y.   -  person Matthew Hui    schedule 18.04.2020
comment
Нет, например: {начало = (5,45, 6,25), пункт назначения = (6,35, 6,75)} и другие траектории, например {начало = (5,50, 6,25), пункт назначения = (6,35, 6,80)} более или менее совпадают .поскольку они покинули точку O и идут в точку D, которая более или менее одинакова, набор данных содержит более 5000 элементов, поэтому существует множество маршрутов, которые повторяются как точки отправления и назначения, но для разных моментов. времени. Я хочу выяснить, какие из этих маршрутов наиболее повторяются.   -  person Ander Jarauta Álvarez    schedule 18.04.2020


Ответы (1)


Все, о чем вы просите, — это многомерный биннинг.

Я создал случайный набор данных dt о происхождении и назначении для демонстрации. Выходным результатом является data.table, который дает следующую информацию о наиболее часто встречающейся траектории:

  • Нижний и верхний пределы координат x-y, которые определяют исходную сетку
  • Нижний и верхний пределы координат x-y, которые определяют сетку назначения
  • Считать
library(data.table)
library(magrittr)

N <- 5000
set.seed(123)
gp <- 0.1 #grid precision

# Generate an example dataset -----
{
  dt <- data.table(
    origin_x = rnorm(N, 1, 0.1),
    origin_y = rnorm(N, 2, 0.1),
    destination_x = rnorm(N, 11, 0.1),
    destination_y = rnorm(N, 12, 0.1)
  )
}

# Grid formation ----
{
  ## Defining the ranges (LL and UL stand for lower and upper limits, respectively) ----
  {
    origin_x_LL <- dt[, origin_x] %>% min %>% divide_by(gp) %>% floor %>% multiply_by(gp)
    origin_x_UL <- dt[, origin_x] %>% max %>% divide_by(gp) %>% ceiling %>% multiply_by(gp)
    origin_y_LL <- dt[, origin_y] %>% min %>% divide_by(gp) %>% floor %>% multiply_by(gp)
    origin_y_UL <- dt[, origin_y] %>% max %>% divide_by(gp) %>% ceiling %>% multiply_by(gp)
    destination_x_LL <- dt[, destination_x] %>% min %>% divide_by(gp) %>% floor %>% multiply_by(gp)
    destination_x_UL <- dt[, destination_x] %>% max %>% divide_by(gp) %>% ceiling %>% multiply_by(gp)
    destination_y_LL <- dt[, destination_y] %>% min %>% divide_by(gp) %>% floor %>% multiply_by(gp)
    destination_y_UL <- dt[, destination_y] %>% max %>% divide_by(gp) %>% ceiling %>% multiply_by(gp)
  }
  ## Forming the breaks for binning ----
  {
    origin_x_brks <- seq(origin_x_LL, origin_x_UL, by = gp)
    origin_y_brks <- seq(origin_y_LL, origin_y_UL, by = gp)
    destination_x_brks <- seq(destination_x_LL, destination_x_UL, by = gp)
    destination_y_brks <- seq(destination_y_LL, destination_y_UL, by = gp)
  }
  ## Computing the number of bins ----
  {
    origin_x_Nbin <- length(origin_x_brks) - 1L
    origin_y_Nbin <- length(origin_y_brks) - 1L
    destination_x_Nbin <- length(destination_x_brks) - 1L
    destination_y_Nbin <- length(destination_y_brks) - 1L
  }
  ## Binning ----
  {
    origin_x_bin <- .bincode(dt[, origin_x], origin_x_brks, include.lowest = T)
    origin_y_bin <- .bincode(dt[, origin_y], origin_y_brks, include.lowest = T)
    destination_x_bin <- .bincode(dt[, destination_x], destination_x_brks, include.lowest = T)
    destination_y_bin <- .bincode(dt[, destination_y], destination_y_brks, include.lowest = T)
  }
}

# Counting grid frequency ----
{
  grid_count <-
    lapply(seq(origin_x_Nbin), function(i) {
      lapply(seq(origin_y_Nbin), function(j) {
        lapply(seq(destination_x_Nbin), function(m) {
          lapply(seq(destination_y_Nbin), function(n) {
            this_count = which(origin_x_bin == i & origin_y_bin == j & destination_x_bin == m & destination_y_bin == n) %>% length
            return(data.table(origin_x_LL = origin_x_brks[i], origin_x_UL = origin_x_brks[i + 1],
                              origin_y_LL = origin_y_brks[j], origin_y_UL = origin_y_brks[j + 1],
                              destination_x_LL = destination_x_brks[m], destination_x_UL = destination_x_brks[m + 1],
                              destination_y_LL = destination_y_brks[n], destination_y_UL = destination_y_brks[n + 1],
                              count = this_count))
          }) %>% rbindlist
        }) %>% rbindlist
      }) %>% rbindlist
    }) %>% rbindlist
}

# Getting the most frequent grid ----
{
  print(grid_count[count == max(count)])
}
person Matthew Hui    schedule 18.04.2020
comment
Большое спасибо, это как раз то, что я искал!! - person Ander Jarauta Álvarez; 18.04.2020