R语言如何实现数据框中三位长度值前补0操作
R数据框三位字符值前补0实现方案
问题说明
数据框df1的values列存储了3位、4位长度的字符型数值,需要仅对3位长度的值在开头拼接0,4位值保持不变。
- 原始数据前6行:
df1 %>% head() values <ch> 2355 560 6699 322 0923 804
- 预期处理结果:
df1 %>% head() values <ch> 2355 0560 6699 0322 0923 0804
原有代码问题
你之前写的代码用filter()是按条件筛选符合要求的行,而非修改列值,因此直接拼接paste0()无法达成修改值的目的,列值修改需要通过mutate()函数实现。
最简实现方案
不需要单独写正则匹配长度,直接用stringr包的str_pad()函数做字符串补位即可:把所有值统一按4位长度做左侧补0,原本4位的值不会被改动,3位值会自动在开头补上0,和需求完全匹配。
library(tidyverse) df1 <- df1 %>% mutate(values = str_pad(values, width = 4, side = "left", pad = "0"))
正则匹配写法(适配原有思路)
如果要沿用str_detect()匹配3位长度的逻辑,配合ifelse()做条件判断即可:
df1 <- df1 %>% mutate( values = ifelse( str_detect(values, "^.{3}$"), paste0("0", values), values ) )
Base R无依赖写法
不加载tidyverse也可以直接用基础包的sprintf()一行实现:
df1$values <- sprintf("%04s", df1$values)
以上三种写法运行后都能得到预期的处理结果。
内容的提问来源于stack exchange,提问作者Munrock
相关产品推荐
相关产品推荐

