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