Tavi
Tavi

Reputation: 2748

pad numeric column with leading zeros

I've been looking into this for the past few hours. I have tried using sprintf but it changes the column to character. All I want to do is to have a fixed-width numeric column, padded with zeros.

Upvotes: 3

Views: 1273

Answers (2)

BrodieG
BrodieG

Reputation: 52647

If you're willing to use a custom class, you can write a print method that does this. Make a data frame, and give it a custom class:

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))

Write a print method that uses @BenBolker's formatting:

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

And then:

DF

Produces:

   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

You can still use the data frame the same way since the numbers are only converted when they are printed.

> sum(DF$b)
[1] 118

Upvotes: 5

Ben Bolker
Ben Bolker

Reputation: 226192

If you give more context we might be able to help you solve your ultimate (rather than proximal) problem, e.g. if you need output in this format but without quotation marks:

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

write.csv(...,quote=FALSE) might be helpful too

Upvotes: 4

Related Questions