如何在R中为数据框指定行的整数列添加前导零
问题解决:给整数ID补前导零以合并数据框
问题背景
有两个数据框,都包含Facility.ID列:
- df1(即你使用的
final2019)中该列是整数类型,包含5位或6位数字,前536行是5位,缺少前导零 - df2中该列是6位字符类型,所有原5位ID都补了前导零(比如df1的10001在df2里是010001)
需要统一两列格式后合并,但你用sprintf的代码报错了:
final2019 <- transform(final2019, Facility.ID = as.character(Facility.ID)) %>% sprintf("%06d", final2019$Facility.ID)
报错信息:
Error in sprintf(., "%06d", final2019$Facility.ID) :
'fmt' is not a character vector
报错原因
你用管道符%>%时,把transform返回的数据框传给了sprintf的第一个参数,但sprintf的第一个参数应该是格式字符串("%06d"),这就导致把数据框当成了格式参数,所以触发报错。
正确解决方案
方法1:dplyr管道风格(推荐)
直接在mutate里对列做格式转换,不用额外先转字符,sprintf会自动处理类型转换:
library(dplyr) final2019 <- final2019 %>% mutate(Facility.ID = sprintf("%06d", Facility.ID))
解释:sprintf("%06d", x)会把整数x转为6位字符,不足位数的自动在左侧补零,不管原ID是5位还是6位都能统一格式。
方法2:stringr字符串补零
如果偏好更直观的字符串操作逻辑:
library(stringr) library(dplyr) final2019 <- final2019 %>% mutate(Facility.ID = as.character(Facility.ID), Facility.ID = str_pad(Facility.ID, width = 6, side = "left", pad = "0"))
解释:先把整数转成字符,再用str_pad在左侧补零,直到长度为6位。
方法3:基础R写法(无需额外包)
直接对数据框列做操作,代码最简洁:
final2019$Facility.ID <- sprintf("%06d", final2019$Facility.ID)
处理完成后,final2019的Facility.ID格式就和df2完全一致了,直接用merge()或者dplyr的left_join()等合并函数就能完成数据框合并。
内容的提问来源于stack exchange,提问作者OFay
相关产品推荐
相关产品推荐

