sf: записать Lat / Long из геометрии в отдельный столбец и сохранить столбец ID - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть df с идентификаторами полигонов из шейп-файла и их центральными точками в столбце геометрии:

# A tibble: 3 x 2
     ID     geometry
  <dbl> <POINT [°]>
1     1 (117.2 31.8)
2     2 (116.4 40.1)
3     4   (117.9 26)

Я хочу поместить значения широты / долготы в отдельные столбцы, поэтому я делаю:

library(sf)
centres<- as.data.frame(st_coordinates(df))

Этот новый фрейм данных 'центров' имеет значения lat и long, но пропускает столбец ID.Как я могу сохранить его, или есть другой способ получить значения lat & long в отдельные столбцы из столбца геометрии, сохраняя идентификатор в том же df?

dput для кадра данных:

df <- structure(list(ID = c(1, 2, 4), 
      geometry = structure(list(structure(c(117.2, 31.8), 
      class = c("XY", "POINT", "sfg")), structure(c(116.4, 40.1), 
      class = c("XY", "POINT", "sfg")), structure(c(117.9, 26.0), 
      class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT", "sfc"), 
      precision = 0, bbox = structure(c(xmin = 116.4, ymin = 26.0, xmax = 117.9, ymax = 40.1), 
      class = "bbox"), crs = structure(list(epsg = 4326L, 
      proj4string = "+proj=longlat +datum=WGS84 +no_defs"), class = "crs"), n_empty = 0L)), 
      row.names = c(NA, -3L), class = c("sf", "tbl_df", "tbl", "data.frame"), 
      sf_column = "geometry", agr = structure(c(ID = NA_integer_), 
      class = "factor", .Label = c("constant", "aggregate", "identity")))

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Возможный подход состоит в том, чтобы отменить его.

setNames(data.frame(df[[1]], 
                    matrix(unlist(df[2]), ncol=2, byrow=TRUE)), 
         c("ID", "lon", "lat"))

#   ID   lon  lat
# 1  1 117.2 31.8
# 2  2 116.4 40.1
# 3  4 117.9 26.0

Пояснение

Проверка структуры данных с помощью str(df) показывает, чтопеременная - geometry - имеет формат list, что может быть неудобным.Чтобы решить эту проблему, нужно unlist() преобразовать ее в матрицу из 2 столбцов и собрать ее с первым столбцом.С setNames() мы можем назначить новые имена столбцов за один шаг.

0 голосов
/ 17 февраля 2019

Решение с использованием unlist + map ()

library(tidyverse)

separated_coord <- df %>%
    mutate(lat = unlist(map(df$geometry,1)),
           long = unlist(map(df$geometry,2)))

separated_coord
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...