Jon*_*rne 3 printf r number-formatting dataframe leading-zero
我有一个数据框,希望数字变量的长度为四位数字,为了做到这一点,我需要添加 1-3 个前导零,我选择执行此操作的方法是 sprintf 函数,因为数字并不重要转换为字符类。不幸的是结果没有按照我想要的顺序出现
测试数据帧的制作如下,并将前导 0 列添加为第三列,以便于比较。通过运行代码可以看出,粘贴前导零数字的顺序与原始数字顺序不符
test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test[,3]<-sprintf("%04d", test[,2])
Run Code Online (Sandbox Code Playgroud)
通过将原始数字列分类为字符,按字母顺序重新排列数据帧顺序,sprintf 数字现在按升序排列,尽管数字系列不是。
test.two <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.two <- test.two[i <-order(as.character(test.two[,2])),]
test.two[,3]<-sprintf("%04d", test.two[,2])
Run Code Online (Sandbox Code Playgroud)
我可以通过弗兰肯斯坦将其组合在一起来创建所需的数据集。
test.three <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.three[,3]<-test.two[,3]
Run Code Online (Sandbox Code Playgroud)
然而,我想知道我做错了什么,以及什么方法可以给我带来我期望从我认为简单的操作中得到的结果!
这是由于第二列是一个因素。
test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
sapply(test, class)
## letters V2
## "factor" "factor"
test[,3]<-sprintf("%04d", test[,2])
as.numeric(test$V2)
## [1] 1 12 20 21 22 23 24 25 26 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18
## [26] 19
test$V2 <- as.integer(as.character(test$V2))
test[,4]<-sprintf("%04d", test[,2])
## letters V2 V3 V4
## 1 a 1 0001 0001
## 2 b 2 0012 0002
## 3 c 3 0020 0003
## 4 d 4 0021 0004
## 5 e 5 0022 0005
## 6 f 6 0023 0006
Run Code Online (Sandbox Code Playgroud)