R语言merge合并表后更新字段报对象未找到错误
R合并空间表后更新列值报错解决
问题复现
需求为从关联CSV表取值,更新sf空间对象属性表的字符类型列,当前已完成表关联步骤,关联结果正常,第二步列值更新代码运行失败。
正常运行的表合并代码
通过codigo字段关联空间表parcelas_sql与CSV导入表tbd_cons_sig:
join_sig_csv <- merge(parcelas_sql, tbd_cons_sig, by.x = "codigo", by.y = "codigo", duplicateGeoms=TRUE)
运行失败的更新代码
目标是用右表匹配到的n.cont.y值更新原表的n.cont.x字段:
join_sig_csv[join_sig_csv$n.cont.x == n.cont.x] <- n.cont.y
抛出的错误信息
Error in h(simpleError(msg, call)) : error in evaluating the argument 'i' in selecting a method for function '[<-': object 'n.cont.x' not found
运行环境信息
- R版本:4.1.2 (2021-11-01)
- 系统环境:64位 Windows 7 SP1
- 已加载依赖包:sf、tidyverse、rgdal、sp
错误原因
代码写法存在两个核心问题:
- 行索引的判断条件中,
==右侧的n.cont.x没有指定所属数据框,R会在全局环境搜索同名独立对象,搜索不到就触发对象不存在的报错 - 索引逻辑完全不符合需求:目标是对匹配到的行做列值替换,不需要筛选
n.cont.x等于特定值的行,==判断属于多余的错误逻辑。
正确实现方案
方法1:base R 原生写法(兼容sf空间对象,无额外依赖)
直接对目标列按行赋值即可,不会丢失空间几何信息:
# 全量替换:将所有行的n.cont.x更新为对应行的n.cont.y值 join_sig_csv$n.cont.x <- join_sig_csv$n.cont.y # 按需替换:仅当原n.cont.x为缺失值/空字符串时,才用n.cont.y更新 # join_sig_csv$n.cont.x[is.na(join_sig_csv$n.cont.x) | join_sig_csv$n.cont.x == ""] <- join_sig_csv$n.cont.y[is.na(join_sig_csv$n.cont.x) | join_sig_csv$n.cont.x == ""]
方法2:tidyverse 语法(已加载tidyverse包可直接用)
library(dplyr) # 全量替换 join_sig_csv <- join_sig_csv %>% mutate(n.cont.x = n.cont.y) # 按需替换空值版本 # join_sig_csv <- join_sig_csv %>% # mutate(n.cont.x = ifelse(is.na(n.cont.x) | n.cont.x == "", n.cont.y, n.cont.x))
操作完成后可直接调用st_write(join_sig_csv, "输出路径.shp")导出结果,空间属性不会丢失。
内容的提问来源于stack exchange,提问作者Edgar Figueira
相关产品推荐
相关产品推荐

