我有两个空间数据框,我已经使用R中的sf
包加载。在第一个数据框中,我有(61)个美国县,而在第二个数据框中,我有这些(61)个县的一个子部分。两个数据框具有相同的标识列和这些标识列的相同值,因此对于第一个数据框中的每个县,有一个,而且只有一个,我的目标是:我想获得第三个空间数据框架,其几何列是县与其子部分之间的差异。
我尝试使用以下代码实现上述想法:
library(tidyverse)
library(magrittr)
library(sf)
# Loading shapefiles
dfc <- st_read('data/counties.shp') %>% # Shapefile with (61) US counties
arrange(., st, cty) # Columns that uniquely identify observations
dfp <- st_read('data/county_parts.shp') %>% # Shapefile with (61) US county parts
arrange(., st, cty) # Columns that uniquely identify observations
# Geometry difference between each corresponding pair of observations
geom <- map(seq(nrow(dfc)), function(r)
st_difference(dfc[r, 'geo_cty'], dfp[r, 'geo_sub'])
字符串
(In在上面的代码中,geo_cty
是县几何的列,geo_sub
是县几何的子部分。一旦按st
和cty
排序,dfc
和dfp
中的每行r
都具有相同的(st, cty)
值,因此行geo_cty
覆盖了geo_sub
。)
上面的代码运行得很顺利,但是我没有成功地创建一个空间数据框架,其几何列是我创建的geom
列表。例如,我尝试运行以下代码:
df <- bind_cols(dfc, select(dfp, geo_sub), geom)
型
我得到了以下错误消息:
Error in `stop_vctrs()`:
! Can't recycle `..1` (size 61) to match `..58` (size 0).
Run `rlang::last_error()` to see where the error occurred.
型
如何创建所需的空间数据框架?实现我所解释的想法的最佳方法是什么?
1条答案
按热度按时间kupeojn61#
我更愿意在这里使用join来确保几何体正确对齐,这也可以处理数据集长度因任何原因而不同的情况(以下示例生成了这样的输入)。Join创建了一个
sf
对象,其中包含2个几何体列,可以方便地使用map2()
+st_difference()
进行变异:字符串
生成的
sf
对象:型
可视化:
型
x1c 0d1x的数据
输入数据集,
nc.shp
的一个小子集:型
连接后的
nc
(注意缺少geo_sub
记录)和st_difference()
,3个几何列:型
创建于2023-11-01使用reprex v2.0.2