【问题标题】:R Separating column values using tidyr's separate, but the values are in nested listR使用tidyr分离列值,但值在嵌套列表中
【发布时间】:2018-07-08 05:54:35
【问题描述】:

我正在阅读 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?也许你可以安装这个包并尝试运行它来看看发生了什么。

非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe tidyr tidyverse sf


    【解决方案1】:

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

    由于c18sf 对象,您不必使用geom_polygon。结果,我从您的代码中删除了as.Date,并使用ggplotgeom_sf 绘制c18

    library(USAboundaries)
    library(ggplot2)
    library(sf)
    
    c18 <- us_boundaries("1820-01-01")
    
    ggplot() +
      geom_sf(data = c18)
    

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

    更新

    我对这个问题做了更多的研究。 fortify 函数可以将空间多边形数据框转换为数据框。貌似us_boundaries原版返回的是空间多边形数据框,所以需要用fortify函数将其转换为数据框。

    下面我先将sf对象转换为空间多边形数据框,然后使用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()
    

    【讨论】:

    • 非常感谢 www!我一定会阅读您分享的链接,从您的回复中我真的学到了很多东西,尤其是检查问题的方法!
    • @commentallez-vous 欢迎您。请看我的更新。我想我知道如何使用fortify 函数。如果这解决了您的问题,请接受我的帖子作为答案。
    • 是的,这真的很有帮助!我将运行、检查和阅读文档以更好地理解它。再次感谢您的帮助!
    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2023-02-06
    • 2021-10-11
    • 2021-01-13
    • 2018-01-01
    • 2011-05-18
    相关资源
    最近更新 更多