前导零填充数字列

问题描述:

过去几个小时我一直在研究这个。我曾尝试使用sprintf,但它将列更改为字符。我想要做的就是有一个固定宽度的数字列,用零填充。前导零填充数字列

+2

如果不转换为字符类,则无法填充前导零。 – akrun

+3

数字没有前导零。如果你想让它们以特定的方式格式化,那么你必须转换成字符格式。 – MrFlick

+0

呃哦:(OK然后感​​谢yall – maryam

如果你愿意使用自定义类,你可以写,做这种打印方法。做一个数据帧,并给它一个自定义类:

DF <- data.frame(a=letters[1:10], b=sample(c(1, 10, 100), 10, rep=T), c=sample(c(1, 10, 100), 10, rep=T)) 
class(DF) <- c("my_df", class(DF)) 

编写使用@ BenBolker的格式打印方法:

print.my_df <- function(x, ...) { 
    num.cols <- sapply(x, is.numeric) 
    x[num.cols] <- lapply(x[num.cols], sprintf, fmt="%04d") 
    NextMethod() 
} 

然后:

DF 

产地:

a b c 
1 a 0100 0100 
2 b 0010 0001 
3 c 0001 0010 
4 d 0001 0100 
5 e 0001 0001 
6 f 0001 0001 
7 g 0001 0001 
8 h 0001 0100 
9 i 0001 0100 
10 j 0001 0001 

您仍然可以使用数据框架的方式相同,因为数字仅在打印时转换。

> sum(DF$b) 
[1] 118 
+0

这是行之有效的。谢谢布罗迪 – maryam

如果您提供更多的上下文,我们可能会帮助您解决最终(而非近端)问题,例如,如果你需要输出在这种格式,但不包括引号:

> cat(sprintf("%04d",5),"\n") 
0005 
## or 
> print(sprintf("%04d",5),quote=FALSE) 
[1] 0005 

write.csv(...,quote=FALSE)可能也有帮助

+0

不错,但不是打印,我想保存它作为一个数据框中的列..每个人都说这是不可能的.. – maryam

+0

@maryam:它实际上是不可能的,因为R将_value_存储在数据框中,并且1 == 01 == 001等等。您可以随时保留数字列进行计算,排序,或者添加一个用于显示目的的字符 –

+0

@AlexA。好吧,谢谢Alex – maryam