Как сделать фрейм данных в простой фрейм данных функции?
У меня есть таблица с указанием места и координатами x и y в заданной системе координат. Я хочу превратить это в простой фрейм данных. Как я могу создать это?
Я думал, что это может быть:
data_frame(place = "London",
lat = 51.5074, lon = 0.1278,
epsg = 4326) %>%
group_by(place) %>%
mutate(feature = st_point(c(lon, lat)))
Но это приводит к ошибке:
Ошибка в mutate_impl (.data, точки): столбец
feature
должна быть длина 1 (размер группы), а не 2
Это, вероятно, довольно просто сделать, я просто не вижу, чтобы это легко обсуждалось в документации. Большинство пространственных аналитиков, по-видимому, требуют лучших данных по умолчанию:).
Я тоже подумал попробовать:
data_frame(place = "London",
lat = 51.5074, lon = 0.1278,
epsg = 4326) %>%
group_by(place) %>%
do(with(., {
p <- st_point(c(lon, lat))
pcol <- st_as_sfc(p)
st_as_sf(data_frame(place = place,
point = pcol),
crs = epsg)
}))
В конце конвейера я хочу простой фрейм данных о функциях, который я могу рисовать и манипулировать, как и любой другой.
Еще один недостаток в том, что я пытаюсь сделать, это то, что у меня есть фрейм данных со столбцом для EPSG. Мне нужно создать этот простой фрейм данных для каждого места и объединить все это в более крупный простой фрейм данных.
2 ответа
Насколько я знаю, вы не можете хранить геометрии с более чем одним crs в одном и том же data.frame. Однако вы можете использовать подход списка, где каждый элемент списка представляет собой sf data.frame, представляющий "место" со своим собственным epsg. Может быть, это то, что вы после?
library(sf)
library(tibble)
df <- data_frame(place = c("London", "Kalamazoo"),
lat = c(51.5074, 396088), lon = c(0.1278, 5452158),
epsg = c(4326, 32610))
l <- lapply(unique(df$place), function(x){
df <- df[df$place == x,]
epsg <- df$epsg[1]
df <- st_as_sf(df, coords = c('lon', 'lat'), crs = epsg)
})
Затем вы можете преобразовать все в один и тот же epsg и объединить в один data.frame:
do.call(rbind, lapply(l, function(x) x <- st_transform(x, 4326)))
Ваша попытка и принятые ответы неоправданно сложны и ужасно запутаны. Просто иди с st_as_sf
(что, кстати, также легко переносит все объекты из устаревших sp
класс (SpatialPolygonsDataFrames и тому подобное)):
df <- data.frame(place = "London",
lat = 51.5074, lon = 0.1278,
population = 8500000) # just to add some value that is plotable
projcrs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
df <- st_as_sf(x = df,
coords = c("lon", "lat"),
crs = projcrs)
И мы сделали, так просто.
Просто чтобы визуализировать это:
library(tmap)
data("World")
tm_shape(World[World$iso_a3 == "GBR", ]) + tm_polygons("pop_est") +
tm_shape(df) + tm_bubbles("population")
Или с новым удивительным geom_sf
из ggplot2:
library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)