R语言合并数据框报错:Lat_long为sfc_MULTIPOLYGON/sfc对象
解决sf空间数据框合并报错问题
问题描述
我有一个过滤后的Id数据框,结构如下:
ID Bonus 35 25.54 36 24.32 37 43.23 38 24.43 39 34.21 40 23.12
想要将其与包含空间数据的City数据框合并:
ID City Lat_Long 35 Paris list(67.14.6552, 67.33539)... 36 Oslo list(70.24.5215, 62.53525)... 37 Berlin list(62.54.3533, 64.63438)... 38 Rome list(67.34.2458, 68.13539)... 39 London list(65.54.6215, 69.23139)... 40 Barcelona list(61.54.3055, 62.73520)... 41 Vilnius list(64.54.6051, 61.23535)... # 另有500多行数据
期望合并后的Id_city结构如下:
ID City Lat_Long Bonus 35 Paris list(67.14.6552, 67.33539)... 25.54 36 Oslo list(70.24.5215, 62.53525)... 24.32 37 Berlin list(62.54.3533, 64.63438)... 43.23 38 Rome list(67.34.2458, 68.13539)... 24.43 39 London list(65.54.6215, 69.23139)... 34.21 40 Barcelona list(61.54.3055, 62.73520)... 23.12
使用dplyr的inner_join尝试合并时:
Id_city <- inner_join(Id, City, by = "ID")
报错提示:Column Lat_long is a sfc_MULTIPOLYGON/sfc object
解决方案
这个报错是因为City是sf类型的空间数据框,普通的dplyr合并函数没法直接处理带空间列的sf对象,下面两种方法可以解决:
方法1:用sf包的st_join直接合并
st_join是sf包专为空间数据框设计的合并函数,支持按属性(比如这里的ID)匹配:
# 先加载sf包 library(sf) Id_city <- st_join(City, Id, by = "ID", join = st_equals)
join = st_equals用来指定按属性精确匹配,保证只合并ID相同的行- 注意参数顺序:第一个传
sf对象(也就是City),第二个传普通数据框(Id)
方法2:先转普通数据框合并,再转回sf对象
如果习惯用dplyr的合并逻辑,可以先把City的空间属性移除,转成普通数据框,合并后再恢复sf类型:
library(dplyr) library(sf) # 把sf对象转成普通数据框(保留空间列数据) City_df <- st_drop_geometry(City) # 执行常规合并 Id_city_df <- inner_join(Id, City_df, by = "ID") # 重新转为sf对象,指定空间列名称 Id_city <- st_as_sf(Id_city_df, sf_column_name = "Lat_Long")
注意要点
- 确保两个数据框的
ID列类型一致(都是数值或字符),不然会匹配失败 - 如果
City的空间列不是Lat_Long,要对应修改代码里的列名 - 用
st_join会保留sf对象的空间特性,适合后续做空间分析操作
内容的提问来源于stack exchange,提问作者Anne Soled
相关产品推荐
相关产品推荐

