formatting - R 如何添加前导零?

我有一组数据,这些数据类似于:


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



我想在每个animal 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



我需要在animal之前添加两个或者三个零。

时间:

短版本:使用 formatC 或者 sprintf

较长版本:

有几个用于格式化数字的函数,包括添加前导零。


anim <- 25499:25504


x <- 10 ^ (0:5)



paste ( paste0的变体 ) 通常是你遇到的第一个字符串操作函数。 在简单的情况下,我们总是要预先设置一个零,paste0 是最好的解决方案。


paste0("0", anim)


## [1]"025499""025500""025501""025502""025503""025504"



对于数字中有可以变数字的情况,必须手动计算多少个零,这很糟糕。


library(stringr)


str_pad(anim, 6, pad ="0")


## [1]"025499""025500""025501""025502""025503""025504"



同样,它不是为数字而设计的,所以需要考虑特殊的情况。


str_pad(x, 8, pad ="0")


## [1]"00000001""00000010""00000100""00001000""00010000""0001e+05"



使用固定符号( 不是科学记数法) 格式化数字。


library(withr)


with_options(


 c(scipen = 999), 


 str_pad(x, 8, pad ="0")


)


## [1]"00000001""00000010""00000100""00001000""00010000""00100000"



stri_padstringr 中的str_pad 完全一样。

formatC 是一个到C 函数 printf的接口。 使用它需要一些关于底层函数( 请参见链接)的arcana的知识。 这种情况下,重点是 width 参数,format 为"整型"的"d",以及用于表示零的"0"flag


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"



这是我最喜欢的解决方案,因为它很容易修改宽度。

sprintf 是同 NAME的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." 



format,用于格式化任何类型对象的通用函数,带有一个数字方法。 它有点像 formatC,但是还有另外一个接口。

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

scales 软件包有几个函数,例如 percent,date_format 和 dollar,用于专家的格式类型。

对于一般解决方案,无论在 data$anim 中多少位数,可以使用 sprintf 函数。 它的工作原理如下:


sprintf("%04d", 1)


# [1]"0001"


sprintf("%04d", 104)


# [1]"0104"


sprintf("%010d", 104)


# [1]"0000000104"



在你的情况下,你可能需要: data$anim <- sprintf("%06d", data$anim)

在某些情况下,你可能需要用零填充一个字符串( 比如 在 osx/linux中:


> sprintf("%05s","104")


[1]"00104"



但是由于 sprintf() 调用了操作系统 sprintf() 命令,所以这里讨论了 ,在Windows 7中,得到了不同的结果:


> sprintf("%05s","104")


[1]" 104"



所以在 Windows 机器上可以工作的是:


> sprintf("%05d", as.numeric("104"))


[1]"00104"



...