如何在R中手动修正美国县的sfc_POINT质心坐标?
修正sf对象中指定要素的几何坐标(以弗吉尼亚州Accomack县质心为例)
问题背景
在R中通过dplyr、sf、tigris获取美国各县质心时,部分县质心存在偏差。以弗吉尼亚州的va_cnty(包含该县所有县质心的sf对象)为例,需要手动将Accomack县的质心修正为坐标37.772236, -75.660827,但两次尝试均失败:
失败尝试1
va_cnty[va_cnty$NAME %in% 'Accomack',7] <- st_point(c(-75.660827,37.772236))
报错:
Error in
[<-.data.frame(*tmp*, va_cnty$NAME %in% "Accomack", 7, value = c(-75.660827,: replacement has 2 rows, data has 1
失败尝试2
sfc = st_sfc(st_point(c(-75.660827,37.772236)), crs = 'NAD83') va_cnty[va_cnty$NAME %in% 'Accomack',7] <- sfc
警告:
In
[<-.data.frame(*tmp*, va_cnty$NAME %in% "Accomack", 7, value = list( : replacement element 1 has 2 rows to replace 1 rows
错误原因
sf对象的geometry列是sfc(simple feature column)类型,本质是列表结构,每个元素对应一个要素的几何。直接用数据框索引赋值时,会把单个sfc元素当成多值列表处理,导致维度不匹配。
正确修正方法
方法1:使用dplyr语法(推荐)
通过mutate结合if_else精准替换目标要素的几何,同时保留原sf对象的CRS:
library(dplyr) library(sf) va_cnty <- va_cnty %>% mutate(geometry = if_else(NAME == "Accomack", st_sfc(st_point(c(-75.660827, 37.772236)), crs = st_crs(va_cnty)), geometry))
方法2:使用Base R索引
直接定位到geometry列的单个元素进行替换,注意要生成与原对象CRS一致的sfc对象:
# 获取目标行的索引 target_idx <- which(va_cnty$NAME == "Accomack") # 替换该索引对应的几何 va_cnty$geometry[target_idx] <- st_sfc(st_point(c(-75.660827, 37.772236)), crs = st_crs(va_cnty))
验证修正结果
可以通过以下代码检查Accomack县的坐标是否正确:
va_cnty %>% filter(NAME == "Accomack") %>% st_coordinates()
输出应显示:
X Y 1 -75.66083 37.77224
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

