R - Spatstat - Поиск ближайшего соседа по идентификатору с использованием таблицы данных

QLG

У меня есть два больших фрейма данных, которые называются intersections(представляющие пересечения уличной системы) и users(представляющие пользователей сети) следующим образом:

intersectionsимеет три колонки: x, yи label_street. Они соответственно представляют положение перекрестка в квадратном окне наблюдения (скажем [0,5] x [0,5]) и улицу, на которой он расположен. Вот пример:


intersections <- data.frame(x=c(0.147674, 0.235356, 0.095337, 0.147674), y=c(0.132956, 0.150813, 0.087345, 0.132956), label_street = c(5,6,5,6))

head(intersections)

            x        y label_street
1    0.147674 0.132956            5
2    0.235356 0.150813            6
3    0.095337 0.087345            5
4    0.147674 0.132956            6

Поскольку перекресток находится на пересечении нескольких улиц, каждая (x,y)комбинация в intersectionsтаблице появляется как минимум дважды, но с разными label_street(например, строки 1 и 4 в предыдущем примере). label_streetНе может быть номер строки (именно поэтому он начинается в 5 в моем примере).

users4 колонки: x, y, label_street, ID. Они соответственно представляют положение пользователя, улицу, на которой он расположен, и уникальны для IDкаждого пользователя. В этом фрейме данных нет дубликатов, так как пользователь находится на уникальной улице и имеет уникальный ID. Вот пример ( IDи label_streetможет не быть номером строки)


users <- data.frame(x = c(0.20428152, 0.17840619, 0.12964668, 0.20423856, 0.19349761, 0.10861251), y = c(0.14448448, 0.13921481, 0.11724543, 0.14447573, 0.14228827, 0.09891443), label_street = c(6,6,5,6,6,5), ID = c(2703, 3460, 4325, 12506, 19753, 21282))


head(users)
              x          y label_street      ID
1    0.20428152 0.14448448            6    2703
2    0.17840619 0.13921481            6    3460
3    0.12964668 0.11724543            5    4325
4    0.20423856 0.14447573            6   12506
5    0.19349761 0.14228827            6   19753
6    0.10861251 0.09891443            5   21282

То , что я хочу сделать , это следующее: для каждой точки (x,y)из intersections, получить IDи расстояние до его ближайшего соседа разделяющего же street_label по прибытиюusers

У меня есть рабочее решение, использующее spatstatфункцию nncrossпоиска ближайшего соседа и plyrфункцию adplyдля работы с данными.

Мое рабочее решение выглядит следующим образом:

1) Напишите определяемую пользователем функцию, которая получает идентификатор и расстояние до ближайшего соседа строки в таблице запросов.

 NN <- function(row,query){
 df <- row
 window <- c(0,5,0,5)   #Need this to convert to ppp objects and compute NN distance using nncross
 NN <- nncross(as.ppp(row[,1:2],window),as.ppp(query[,1:2],window))
 df$NN.ID <- query$ID[NN$which]
 df$dist <- NN$dist
 return(df)
}

2) Примените эту определяемую пользователем функцию построчно к моим «пересечениям» фреймов данных, при этом запрос будет подмножеством пользователей, использующих тот же street_label, что и строка:

result <- adply(intersections, 1, function(row) NN(row, users[users$label_street == row$label_street, ])

Результат на примере следующий:

head(result)
           x           y    label_street     NN.ID         NN.dist
1   0.147674    0.132956               5      4325      0.02391247
2   0.235356    0.150813               6      2703      0.03171236
3   0.095337    0.087345               5     21282      0.01760940
4   0.147674    0.132956               6      3460      0.03136304


Поскольку мои реальные фреймы данных будут огромными, я думаю, что вычисление матриц расстояний для просмотра ближайшего соседа не будет эффективным и adplyбудет медленным. Есть у кого-нибудь идея data.tableподобного решения? Я только сейчас об основах data.tableи всегда считал это очень эффективным по сравнению с plyr.

М. Папенберг

Это решение использует RANNпакет для поиска ближайших соседей. Хитрость заключается в том, чтобы сначала убедиться, что у разных элементов label_streetрасстояние между ними больше, чем у элементов внутри одного label_street. Мы делаем это, добавляя дополнительный числовой столбец с очень большим значением, которое является постоянным внутри одного и того же, label_streetно разным между разными значениями label_street. Всего вы получите:

intersections <- data.frame(x=c(0.147674, 0.235356, 0.095337, 0.147674), y=c(0.132956, 0.150813, 0.087345, 0.132956), label_street = c(5,6,5,6))
users <- data.frame(x = c(0.20428152, 0.17840619, 0.12964668, 0.20423856, 0.19349761, 0.10861251), y = c(0.14448448, 0.13921481, 0.11724543, 0.14447573, 0.14228827, 0.09891443), label_street = c(6,6,5,6,6,5), number = c(2703, 3460, 4325, 12506, 19753, 21282))

# add a numeric column that is constant within each category and has a very large value
intersections$label_street_large <- intersections$label_street * 1e6
users$label_street_large <- users$label_street * 1e6

# call the nearest neighbour function (k = 1 neighbour)
nearest_neighbours <- RANN::nn2(
  intersections[, c("x", "y", "label_street_large")],
  users[, c("x", "y", "label_street_large")],
  k = 1
)

# get original IDs and distances
IDs <- users$number[c(nearest_neighbours$nn.idx)]
distances <- c(nearest_neighbours$nn.dists)

IDs
# [1]  3460 12506  2703  3460  3460  4325
distances
# [1] 0.03171236 0.03136304 0.02391247 0.03175620 0.04271763 0.01760940

Я надеюсь, это поможет вам. Он должен быть очень быстрым, потому что он вызывается только nn2один раз, что выполняется за время O (N * log (N)).

Эта статья взята из Интернета, укажите источник при перепечатке.

Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    TypeError: store.getState não é uma função. (Em 'store.getState ()', 'store.getState' é indefinido, como posso resolver esse problema?

  3. 3

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  4. 4

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  5. 5

    How to click an array of links in puppeteer?

  6. 6

    Merging legends in plotly subplot

  7. 7

    ViewPager2 мигает / перезагружается при смахивании

  8. 8

    Отчеты Fabric Debug Craslytic: регистрация, отсутствует идентификатор сборки, применить плагин: io.fabric

  9. 9

    How to normalize different curves drawn with geom = "step" when using stat_summary

  10. 10

    无法通过Vue在传单中加载pixiOverlay

  11. 11

    как я могу удалить vue cli 2?

  12. 12

    Как я могу нарисовать заполненный прямоугольник в JFreeChart?

  13. 13

    SQL Вычтите две строки друг от друга в одном столбце, чтобы получить результат

  14. 14

    Elasticsearch - Нечеткий поиск не дает предложения

  15. 15

    Single legend for Plotly subplot for line plots created from two data frames in R

  16. 16

    Описание моего типа Parser как серии преобразователей монад

  17. 17

    Как изменить цвета запятых и скобок в VS Code

  18. 18

    Сброс значения <input type = "time"> в Firefox

  19. 19

    Почему прокси в vue.config.js 404

  20. 20

    Как установить параметр -noverify с gradle ktx для робоэлектрических тестов Android?

  21. 21

    В чем разница между ifstream, ofstream и fstream?

популярныйтег

файл