使用前导零填充数字列

3

我已经花了几个小时来研究这个问题。我尝试使用sprintf,但它会将列更改为字符类型。我想要的只是一个固定宽度的数字列,并用零填充。


2
您无法在不转换为字符类的情况下填充前导零。 - akrun
3
数字没有前导零。如果您想按特定方式格式化它们,那么您必须将其转换为字符格式。 - MrFlick
哎呀 :( 好的,谢谢大家 - Tavi
@AlexA.,也许不用了,因为原帖作者已经知道sprintf()的用法了... - Ben Bolker
@AlexA。在发布这个之前我已经看过了。区别在于他的变量保存的是ID,因此可以使用因子或字符类,但我的变量是数字类型的。 - Tavi
2个回答

5

如果你愿意使用自定义类,你可以编写一个打印方法来执行此操作。创建一个数据帧,并为它提供一个自定义类:

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

4
如果您提供更多的上下文,我们可能能够帮助您解决最终问题(而不是近端问题),例如,如果您需要这种格式的输出但没有引号:
> cat(sprintf("%04d",5),"\n")
0005 
## or
> print(sprintf("%04d",5),quote=FALSE)
[1] 0005

write.csv(...,quote=FALSE) 也许对您有所帮助


不错。但是我想将它保存为数据框中的一列,而不是打印出来。每个人都说这是不可能的。 - Tavi
@maryam:这确实是不可能的,因为R将_value_存储在数据框中,而1 == 01 == 001等。您始终可以保留数字列进行计算、排序或其他操作,并添加一个字符列以供显示目的。 - Alex A.
就像我一直在说的那样:如果您告诉我们在数据框中将其保存为列的原因(这确实是不可能的),也许我们可以给您提供解决问题的不同方法(例如@AlexA的回答,他们或者我可以将其编辑到我的回答中...) - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接