如何添加前导零?

独自空忆成欢 提交于 2020-03-15 19:48:40

我有一组看起来像这样的数据:

anim <- c(25499,25500,25501,25502,25503,25504)
sex  <- c(1,2,2,1,2,1)
wt   <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)

data
   anim sex  wt anim2
1 25499   1 0.8     2
2 25500   2 1.2     2
3 25501   2 1.0     2
4 25502   1 2.0     2
5 25503   2 1.8     2
6 25504   1 1.4     2

我希望在每个动物ID之前添加一个零:

data
   anim sex  wt anim2
1 025499   1 0.8     2
2 025500   2 1.2     2
3 025501   2 1.0     2
4 025502   1 2.0     2
5 025503   2 1.8     2
6 025504   1 1.4     2

出于兴趣考虑,如果我需要在动物ID之前添加两个或三个零该怎么办?


#1楼

扩展@goodside的响应:

在某些情况下,您可能希望用零填充字符串(例如,fip代码或其他类似数字的因子)。 在OSX / Linux中:

> sprintf("%05s", "104")
[1] "00104"

但是由于sprintf()调用了操作系统的C sprintf()命令(在此进行了讨论),因此在Windows 7中,您会得到不同的结果:

> sprintf("%05s", "104")
[1] "  104"

因此,在Windows计算机上,解决方法是:

> sprintf("%05d", as.numeric("104"))
[1] "00104"

#2楼

str_pad包中的stringr是替代方法。

anim = 25499:25504
str_pad(anim, width=6, pad="0")

#3楼

data$anim <- sapply(0, paste0,data$anim)

#4楼

这是在字符串(例如CUSIP)中添加前导0的另一种选择,有时看起来像数字,并且许多应用程序(例如Excel)会破坏并删除前导0或将其转换为科学计数法。

当我尝试@metasequoia提供的答案时,返回的向量有前导空格而不是0 s。 这是@ user1816679提到的相同问题-删除0前后的引号或从%d更改为%s也没有任何区别。 仅供参考,我正在使用在Ubuntu服务器上运行的RStudio服务器。 这个小小的两步解决方案为我工作:

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

使用magrittr软件包中的%>%管道函数,它看起来可能像这样:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

我更喜欢一种功能的解决方案,但是它可以工作。


#5楼

对于希望数字字符串保持一致的其他情况,我做了一个函数。

有人可能会发现这很有用:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

抱歉,格式化。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!