R 使用 tidyr separate 分隔列值,但值在嵌套列表中

R Separating column values using tidyr's separate, but the values are in nested list

我正在阅读 Hadley Wickham 写的 ggplot2 书,并遵循其中的代码。然而,USABoundaries 包并不像书中所示那样工作。 在书中,代码是这样工作的:

library(USAboundaries)
c18 <- us_boundaries(as.Date("1820-01-01"))
c18df <- fortify(c18)
#> Regions defined for each Polygons
head(c18df)
#> long lat order hole piece id group
#> 1 -87.6 35 1 FALSE 1 4 4.1
#> 2 -87.6 35 2 FALSE 1 4 4.1
#> 3 -87.6 35 3 FALSE 1 4 4.1
#> 4 -87.6 35 4 FALSE 1 4 4.1
#> 5 -87.5 35 5 FALSE 1 4 4.1
#> 6 -87.3 35 6 FALSE 1 4 4.1
ggplot(c18df, aes(long, lat)) +
 geom_polygon(aes(group = group), colour = "grey50", fill = NA) +
 coord_quickmap()

然而,当我运行在 RStudio 中使用相同的代码时,数据框完全不同: long 和 lat 值在嵌套列表中矢量化,例如:

geometry
list(list(c(-88.0746219415898, -88.3133290074677, ...)))
list(list(c(-96.7247616421399, -96.0010234528651, ...)))
...
...

...意味着那里有很多很多值。

因此,上面的ggplot代码不起作用,因为数据框没有经度和纬度。 由于没有 long 和 lat 变量(列),我应该如何从这些数据中创建 long 和 lat?也许你可以安装这个包并尝试 运行 看看发生了什么。

非常感谢您的帮助!

我对fortify函数不熟悉,但是注意us_boundaries的输出应该是一个sf对象,还有[=]中指定日期的方式13=] 不需要 as.Date(参见 ?us_boundaries 中的示例)。

由于 c18 是一个 sf 对象,您不必使用 geom_polygon。因此,我从您的代码中删除了 as.Date,并使用 ggplotgeom_sf 绘制了 c18

library(USAboundaries)
library(ggplot2)
library(sf)

c18 <- us_boundaries("1820-01-01")

ggplot() +
  geom_sf(data = c18)

查看此 link 以了解有关绘制 sf 对象的更多信息:https://cran.r-project.org/web/packages/sf/vignettes/sf5.html#ggplot2

更新

我对这个问题做了更多的研究。 fortify 函数可以将 Spatial Polygon Data Frame 转换为数据框。 us_boundaries原版returns貌似是Spatial Polygon Data Frame,所以需要用fortify函数转成Data frame

下面我先把sf对象转成Spatial Polygon Data Frame,然后用fortify函数重现原来的过程。现在我们可以用 geom_polygon.

绘制 c18df
library(USAboundaries)
library(ggplot2)
library(sf)

c18 <- us_boundaries("1820-01-01")

c18spdf <- as(c18, "Spatial")

c18df <- fortify(c18spdf)

ggplot(c18df, aes(long, lat)) +
  geom_polygon(aes(group = group), colour = "grey50", fill = NA) +
  coord_quickmap()