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
,并使用 ggplot
和 geom_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()
我正在阅读 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
,并使用 ggplot
和 geom_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()