R使用Tidyr的分隔符分隔列值,但这些值在嵌套列表中

时间:2018-07-08 05:54:35

标签: r dataframe tidyr tidyverse sf

我正在阅读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变量(列),我该如何从该数据创建long和lat?也许您可以安装此软件包并尝试运行它以查看发生了什么。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我对fortify函数不熟悉,但是请注意us_boundaries的输出应该是sf对象,以及在{{1}中指定日期的方式}不需要us_boundaries(请参阅as.Date中的示例)。

由于?us_boundariesc18对象,因此您不必使用sf。结果,我从代码中删除了geom_polygon,并使用as.Datec18绘制了ggplot

geom_sf

enter image description here

请参见以下链接,以了解有关绘制library(USAboundaries) library(ggplot2) library(sf) c18 <- us_boundaries("1820-01-01") ggplot() + geom_sf(data = c18) 对象的更多信息:https://cran.r-project.org/web/packages/sf/vignettes/sf5.html#ggplot2

更新

我在这个问题上做了更多的研究。 sf函数可以将空间多边形数据帧转换为数据帧。看起来原始版本的fortify返回了一个空间多边形数据帧,因此必须使用us_boundaries函数将其转换为数据帧。

下面,我首先将fortify对象转换为空间多边形数据框,然后使用sf函数重现原始过程。现在我们可以用fortify绘制c18df

geom_polygon

enter image description here