R 如何添加前导零?

R 如何添加前导零?,r,formatting,number-formatting,r-faq,R,Formatting,Number Formatting,R Faq,我有一组数据如下所示: 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

我有一组数据如下所示:

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
sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"

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

对于一个通用解决方案,无论数据$anim中有多少个数字,都可以使用
sprintf
功能。它的工作原理如下:

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
sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"
在您的情况下,您可能需要:
data$anim短版本:使用或


较长版本:

有几个函数可用于格式化数字,包括添加前导零。哪种格式最好取决于您希望执行的其他格式

这个问题的例子很简单,因为所有的值都有相同的数字开始,所以让我们尝试一个更难的例子,也就是10宽度8的幂

anim <- 25499:25504
x <- 10 ^ (0:5)
对于数字中位数可变的情况,您必须手动计算要预加多少个零,这已经够可怕了,您应该出于病态的好奇才这样做


stringr
中的
paste
的工作原理类似,这使得您希望填充内容更加明确

library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
再说一次,它并不是专门为数字设计的,所以更难的情况需要考虑一下。我们应该说“用零填充宽度为8”,但看看这个输出:

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
您需要设置科学惩罚,以便始终使用固定符号(而不是科学符号)格式化数字


stringi
中,其工作原理与
stringr
中的
stru-pad
完全相同


是C函数的接口。使用它需要对底层功能的奥秘有一些了解(请参见链接)。在这种情况下,重要的一点是
width
参数,
format
对于“整数”是
“d”
,对于零的前置是
“0”
标志

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
这是我最喜欢的解决方案,因为它很容易修改宽度,而且功能强大,足以进行其他格式更改


是同名C函数的接口;类似于
formatC
,但语法不同

sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
sprintf
的主要优点是可以将格式化的数字嵌入较长的文本位中

sprintf(
  "Animal ID %06d was a %s.", 
  anim, 
  sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion."  "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 
另见


为完整起见,值得一提的是其他格式化函数,它们偶尔有用,但没有预加零的方法

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
,一种通用函数,用于格式化任何类型的对象,并带有数字方法。它的工作原理有点像
formatC
,但还有另一个接口

是另一种格式化功能,主要用于创建手动轴刻度标签。它特别适用于范围广泛的数字


scales
软件包具有多个功能,例如,和用于专业格式类型。

在@goodside的代表上展开:

在某些情况下,您可能希望用零填充字符串(例如fips代码或其他类似数字的因子)。在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"

stringr
包中的
stru-pad
是一种替代方案

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

data$anim这里是另一种将前导0添加到字符串的方法,例如有时看起来像一个数字,许多应用程序(如Excel)会损坏前导0或将其转换为科学记数法

当我尝试@metasequoia提供的答案时,返回的向量有前导空格,而不是
0
s。这与@user1816679提到的问题相同——删除
0
周围的引号或将
%d
更改为
%s
也没有什么区别。仅供参考,我使用的是运行在Ubuntu服务器上的RStudio服务器。这个小的两步解决方案对我很有效:

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

使用
magrittr
软件包中的
%>%
管道功能,它可能如下所示:

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
sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"
sprintf(fmt=“%09s”,ids[,CUSIP])%%>%gsub(pattern=“,replacement=“0”,x=)


我更喜欢单函数的解决方案,但它是有效的。

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

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

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)

idnamer这里有一个可推广的基R函数:

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

pad\u left假设您想在动物ID之前添加n个零,您只需执行
data$anim=paste(rep(0,n),data$anim,sep=“”)
当您说要“添加零”时,您可能不想为了在数据本身中添加零填充而将整数列转换为字符串/类别,您希望在呈现输出时保持它们为整数,并且只打印前导零。请注意,
sprintf
将数字转换为字符串(字符)。谢谢您的回答。我想把13位数字改为14位(加上前导零)。此函数在这种情况下似乎不起作用。它在sprintf中给了我一个arror:Error(“%020d”,400010000104):无效格式“%020d”;对数值对象使用格式%f、%e、%g或%a。有什么建议吗?请尝试:sprintf(“%014.0f”,400010000104)sprintf不适用于R3.4.1是的。它自1.5.0版以来一直保持不变。非常感谢您的帮助。我使用formatC在动画中添加前导零,效果很好。formatC(数字或向量,宽度=6,format=“d”,flag=“0”)效果很好(R版本3.0.2(2013-09-25))。谢谢。以上述方式使用formatC()对我不起作用。它添加了空格而不是零。我做错什么了吗?我使用的是R版本3。