如何将一个数据框变成一个简单的特征数据框?

Posted

技术标签:

【中文标题】如何将一个数据框变成一个简单的特征数据框?【英文标题】:how to make a data frame into a simple features data frame? 【发布时间】:2018-08-17 07:32:34 【问题描述】:

我有一个表格,其中包含给定坐标参考系统中的位置参考和 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, dots) 中的错误:列 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 列的数据框。我需要为每个地方创建这个简单的特征数据框,并将它们组合成一个更大的简单特征数据框。

【问题讨论】:

那么这里想要的输出是什么?您正在尝试在 data.frame 中存储 st_point 对象? 检查st_as_sf。 How to Convert data frame to spatial coordinates @MrFlick 我想在文档中创建一个简单的特征数据框,例如 nc。我有成千上万的这些坐标存储在数据库中,并参考了他们的 espg。但默认情况下,它不会以任何 GIS 友好的方式存储。 谢谢,@Henrik。我想这就是我想知道的。不知何故,我错过了坐标参数。 如果它是重复的,那么根据我之前的评论,这个问题有一个更广泛的部分。我已将其添加到问题中。 【参考方案1】:

您的尝试和接受的答案是不必要的复杂和非常混乱。只需使用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")

或者使用来自 ggplot2 的全新 geom_sf

library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)

【讨论】:

请阅读 OP 问题的最后一部分 - data.frame 具有多个 epsg 值的情况,然后需要将其转换为常见的 epsg。这就是我的答案所针对的。 st_as_sfcrs 参数不接受多个值【参考方案2】:

更新 @Franz Plumpton 的答案是单个 epsg 的正确解决方案。仅当 data.frame 的每一行都有不同的 epsg 时,我下面的答案才是必要的。否则,这将是重复的(正如上面@Henrik 所指出的)。

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)))

【讨论】:

以上是关于如何将一个数据框变成一个简单的特征数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何将元素列表附加到数据框的单个特征中?

如何将数据框变成一系列列表?

尝试将分类特征转换为数值时出现“ValueError:给定列不是数据框的列”

如何测量数据框中特征之间的差异?

如何将 tfidf 特征与自制特征结合起来

如何将表单变成2个数组[重复]