如何使用terra包为Shapefile添加匹配关联的列?
按匹配字段将数据框列添加到Terra矢量数据中
基础数据准备
首先加载Terra包并读取示例Shapefile:
library(terra) #> terra 1.6.7 v <- system.file("ex/lux.shp", package="terra") |> vect()
常规添加字段的方式如下:
v[["ID_new_v1"]] <- 1:nrow(v) v$ID_new_v2 <- 1:nrow(v)
需求说明
现有数据框dat,需要将其中的my列,按照矢量数据v的NAME_2字段与dat的ec字段的对应关系,匹配添加到v中。dat的数据结构如下:
dat=structure(list(ec = c("Diekirch", "Redange"), med.x = c(7, 8), co.x = c(113L, 590L), my = c(3, 5), co.y = c(113L, 590L), per = c(3, 9)), row.names = 1:2, class = "data.frame")
解决方案
方法一:使用merge函数(推荐)
Terra的merge函数可以直接将矢量数据和数据框按指定字段匹配合并,保留矢量数据的所有要素:
# 只选取dat中需要匹配的ec和my列,按对应字段合并 v_merged <- merge(v, dat[, c("ec", "my")], by.x = "NAME_2", by.y = "ec", all.x = TRUE)
参数all.x=TRUE表示保留v中的所有要素,没有匹配到的要素对应的my值会设为NA,符合常规需求。
方法二:使用match手动赋值
通过match函数找到对应索引,再给矢量数据添加新字段:
# 获取v中每个NAME_2在dat$ec中的位置索引 match_pos <- match(v$NAME_2, dat$ec) # 给v添加my字段并赋值 v$my <- dat$my[match_pos]
没有匹配到的位置match会返回NA,因此对应的my值也会是NA。
结果验证
可以通过以下代码查看添加后的字段:
# 查看前几行的NAME_2和my字段 head(v[, c("NAME_2", "my")])
内容的提问来源于stack exchange,提问作者bic ton
相关产品推荐
相关产品推荐

