同一R代码(dplyr/stringr/sf)因包版本差异运行结果不同
问题解决:dplyr rename_with处理sf对象时的版本兼容性报错
问题根源
新版本dplyr(1.1.x及以上)的rename_with函数会自动同步更新sf对象的agr属性(记录各列与几何列的关联关系)的名称,而旧版本dplyr(1.0.x)不会处理这个属性。你的代码直接传入str_remove作为重命名函数,当rename_with处理agr的名称时,只传递了待处理的字符串,没有传入pattern参数,就触发了argument "pattern" missing的报错。
解决方案
方案1:用匿名函数包裹str_remove,确保始终传递pattern
把str_remove放在匿名函数里,明确指定pattern参数,这样不管处理列名还是agr的名称,都能正确传参:
# 替换成你实际要移除的pattern df <- df %>% rename_with(~str_remove(.x, "要移除的匹配模式"))
方案2:指定cols参数,仅重命名非几何列
通过cols参数限定重命名的范围,跳过几何列,避免rename_with去处理agr属性:
# 假设几何列名为geometry,替换成你数据中的实际列名 df <- df %>% rename_with(str_remove, pattern = "要移除的匹配模式", cols = -geometry)
方案3:临时转换为普通数据框重命名后再转回sf
如果上述方案不适用,可以先把sf对象转成普通数据框,重命名后再转回sf(注意保留几何列):
df <- df %>% as.data.frame() %>% rename_with(str_remove, pattern = "要移除的匹配模式") %>% st_sf() # 转回sf对象,自动识别几何列
内容的提问来源于stack exchange,提问作者DOS
相关产品推荐
相关产品推荐

