Создать объект sf из матрицы с двумя столбцами

У меня есть простая матрица с двумя столбцами, которую я хочу преобразовать в объект sf, где каждая строка указывает точку:

> set.seed(123);m=matrix(runif(10),ncol=2)
> m
          [,1]      [,2]
[1,] 0.2875775 0.0455565
[2,] 0.7883051 0.5281055
[3,] 0.4089769 0.8924190
[4,] 0.8830174 0.5514350
[5,] 0.9404673 0.4566147

Самый наивный подход не работает, поскольку apply объединяет точки обратно в матрицу, и операция превращается в очень медленную функцию транспонирования:

> apply(m,1,st_point)
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
[2,] 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147

Лучшее, что я могу придумать без явного цикла, - это этот монстр:

> st_sfc(lapply(data.frame(t(m)),st_point))
Geometry set for 5 features 
geometry type:  POINT
dimension:      XY
bbox:           xmin: 0.2875775 ymin: 0.0455565 xmax: 0.9404673 ymax: 0.892419
epsg (SRID):    NA
proj4string:    NA
POINT(0.287577520124614 0.0455564993899316)
POINT(0.788305135443807 0.528105488047004)
POINT(0.4089769218117 0.892419044394046)
POINT(0.883017404004931 0.551435014465824)
POINT(0.940467284293845 0.456614735303447)

Другой вариант - использовать sp объектов, но я не хочу этого делать. Я также хотел бы решение только на базе R, поэтому без преобразования в data.table или tbl и т. Д.

Мне просто не хватает простой as(m,"sf") функции или чего-то подобного?


r sf
person Spacedman    schedule 27.05.2017    source источник
comment
Как насчет st_as_sf()?   -  person RoyalTS    schedule 27.05.2017
comment
@RoyalTS Это ты пробовал или просто догадываешься?   -  person Spacedman    schedule 27.05.2017
comment
образованное предположение :)   -  person RoyalTS    schedule 27.05.2017


Ответы (2)


Согласно sf docs

m %>% 
  as.data.frame %>% 
  sf::st_as_sf(coords = c(1,2))
person RoyalTS    schedule 27.05.2017
comment
К этим примерам можно добавить еще несколько комментариев. Я внесу некоторые правки и отправлю PR, когда у меня будет время. - person Spacedman; 27.05.2017
comment
Также можно предложить матричный метод: st_as_sf.matrix=function(x,...){st_as_sf(data.frame(x),...)} - person Spacedman; 27.05.2017

Вы можете использовать библиотеку sfheaders для матриц напрямую

sfheaders::sf_point(m)

# Simple feature collection with 5 features and 0 fields
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 0.2875775 ymin: 0.0455565 xmax: 0.9404673 ymax: 0.892419
# epsg (SRID):    NA
# proj4string:    NA
# geometry
# 1 POINT (0.2875775 0.0455565)
# 2 POINT (0.7883051 0.5281055)
# 3  POINT (0.4089769 0.892419)
# 4  POINT (0.8830174 0.551435)
# 5 POINT (0.9404673 0.4566147)
person SymbolixAU    schedule 21.10.2019