Назначьте идентификатор для сегмента дороги (широта и долгота) в R-коде - PullRequest
3 голосов
/ 20 июня 2020

Мне нужны ваши идеи и предложения по работе со следующим набором данных:

 Start_Latitude    Start_Longitude   End_Latitude    End_Longitude       Date        Avg_Speed
     41.92446         -87.68654       41.93184        -87.67459     2020-06-11 6:00       40
     41.90367         -87.63233       41.91600        -87.61911     2020-06-11 6:00       35
     41.86468         -87.76746       41.82341        -87.69162     2020-06-11 6:00       54
     41.96075         -87.74756       41.76543        -87.67459     2020-06-11 6:00       45

У меня есть переменные: Start_Latitude, Start_Longitude и End_Latitude, End_Longitude, которые представляют сегмент дороги, и у меня есть средняя скорость каждой дороги сегмент.

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

данные, которые я хочу, будут выглядеть так:

   St_Lat_Long             End_Lat_Long              Date         Avg_Speed     ID
41.92446, -87.6865       41.93184,-87.67459     2020-06-11 6:00       40         1
41.90367,-87.63233       41.91600,-87.61911     2020-06-11 6:00       35         2
41.86468,-87.76746       41.82341,-87.69162     2020-06-11 6:00       54         3
41.96075,-87.74756       41.76543,-87.67459     2020-06-11 6:00       45         4

Как я могу назначить Id в R-коде? У меня есть следующий код, который назначает идентификатор для одной пространственной точки, которая имеет Start_Latitude, Start_Longitude (2 координаты:

Data$ID <- cumsum(!duplicated(df[1:2]))

 Latitude    Longitude          Date          Avg_Speed    ID
41.92446     -87.68654    2020-06-11 6:00       40          1
41.90367     -87.63233    2020-06-11 6:00       35          2
41.86468     -87.76746    2020-06-11 6:00       54          3
41.96075     -87.74756    2020-06-11 6:00       45          4

Кроме того, можно построить весь сегмент дорог на карте, используя 4 координаты.

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Вот способ адресации первой части вашего сообщения с помощью base:

Data

foo <- tibble::tribble(~Start_Latitude, ~Start_Longitude, ~End_Latitude,    ~End_Longitude, ~Date,           ~Avg_Speed,
                        41.92446,       -87.68654,         41.93184,        -87.67459,      '2020-06-11 6:00',       40,
                        41.90367,       -87.63233,         41.91600,        -87.61911,      '2020-06-11 6:00',       35,
                        41.86468,       -87.76746,         41.82341,        -87.69162,      '2020-06-11 6:00',       54,
                        41.96075,       -87.74756,         41.76543,        -87.67459,      '2020-06-11 6:00',       45)

Code

foo$St_lat_long = paste(foo$Start_Latitude, foo$Start_Longitude, sep = ", ")
foo$End_lat_long = paste(foo$End_Latitude, foo$End_Longitude, sep = ", ")
foo2 <- foo[,c(7,8,5,6)]
foo2$ID <- seq.int(nrow(foo2))

Вывод

  St_lat_long           End_lat_long          Date            Avg_Speed    ID
  41.92446, -87.68654   41.93184, -87.67459   2020-06-11 6:00        40     1
  41.90367, -87.63233   41.916,   -87.61911   2020-06-11 6:00        35     2
  41.86468, -87.76746   41.82341, -87.69162   2020-06-11 6:00        54     3
  41.96075, -87.74756   41.76543, -87.67459   2020-06-11 6:00        45     4

Данные сопоставления

В своем сообщении вы предоставили следующие данные:

    foo <- tibble::tribble(~Latitude, ~Longitude, ~Date, ~Avg_Speed, ~ID, 
    41.92446, -87.68654, "2020-06-11 6:00", 40, 1, 41.90367, 
    -87.63233, "2020-06-11 6:00", 35, 2, 41.86468, -87.76746, 
    "2020-06-11 6:00", 54, 3, 41.96075, -87.74756, "2020-06-11 6:00", 
    45, 4)
#> # A tibble: 4 x 5
#>   Latitude Longitude Date            Avg_Speed    ID
#>      <dbl>     <dbl> <chr>               <dbl> <dbl>
#> 1     41.9     -87.7 2020-06-11 6:00        40     1
#> 2     41.9     -87.6 2020-06-11 6:00        35     2
#> 3     41.9     -87.8 2020-06-11 6:00        54     3
#> 4     42.0     -87.7 2020-06-11 6:00        45     4

Создано 21.06.2020 пакетом REPEX (v0.3.0)

Создание карты с широтой и долготой

Вот подход к отображению последней части вашего вопроса с помощью пакета leaflet:

library(leaflet) %>%
leaflet(foo) %>% 
addTiles() %>% 
addCircleMarkers(lat = ~Latitude, 
                 lng = ~Longitude, 
                 popup = paste("<b>Date:</b>", foo$Date, "<br>", 
                               "<b>Avergae Speed:</b>", foo$Avg_Speed, "<br>", 
                               "<b>ID:</b>", foo$ID, "<br>"))

Создано 21.06.2020 пакет REPEX (v0.3.0)

Вывод

Я опубликовал интерактивный буклет в своих RPub-файлах. Вот ссылка

2 голосов
/ 20 июня 2020

Вы можете объединить столбцы, используя unite, paste их, и создать уникальный ID, используя match и unique.

library(dplyr)
library(tidyr)

df %>%
  unite(St_Lat_Long, Start_Latitude, Start_Longitude, sep = ',') %>%
  unite(End_Lat_Long, End_Latitude, End_Longitude, sep = ',') %>%
  mutate(temp = paste(St_Lat_Long,End_Lat_Long), 
         ID = match(temp, unique(temp))) %>%
  select(-temp)



# A tibble: 4 x 5
#  St_Lat_Long        End_Lat_Long       Date            Avg_Speed    ID
#  <chr>              <chr>              <chr>               <dbl> <int>
#1 41.92446,-87.68654 41.93184,-87.67459 2020-06-11 6:00        40     1
#2 41.90367,-87.63233 41.916,-87.61911   2020-06-11 6:00        35     2
#3 41.86468,-87.76746 41.82341,-87.69162 2020-06-11 6:00        54     3
#4 41.96075,-87.74756 41.76543,-87.67459 2020-06-11 6:00        45     4 

В новом dplyr 1.0.0 вы можете используйте cur_group_id, который присваивает каждой группе уникальный номер.

df %>%
  unite(St_Lat_Long, Start_Latitude, Start_Longitude, sep = ',') %>%
  unite(End_Lat_Long, End_Latitude, End_Longitude, sep = ',') %>%
  group_by(St_Lat_Long, End_Lat_Long) %>%
  mutate(ID = cur_group_id())
1 голос
/ 20 июня 2020

Способ использования dplyr и stringr:

df %>%
  mutate(St_Lat_Long = str_c(Start_Latitude, ", ", Start_Longitude),
         End_Lat_Long = str_c(End_Latitude, ", ", End_Longitude)) %>%
  select(St_Lat_Long, End_Lat_Long, Date, Avg_Speed) %>%
  distinct(across(ends_with("Lat_Long")), .keep_all=TRUE) %>%
  mutate(ID = row_number())

дает

# A tibble: 4 x 5
  St_Lat_Long         End_Lat_Long        Date            Avg_Speed    ID
  <chr>               <chr>               <chr>               <dbl> <int>
1 41.92446, -87.68654 41.93184, -87.67459 2020-06-11 6:00        40     1
2 41.90367, -87.63233 41.916, -87.61911   2020-06-11 6:00        35     2
3 41.86468, -87.76746 41.82341, -87.69162 2020-06-11 6:00        54     3
4 41.96075, -87.74756 41.76543, -87.67459 2020-06-11 6:00        45     4
...