我有一个数据帧,并希望数字变量长度为四位,为了做到这一点,我需要在1-3个前导零之间添加,我选择这样做的方法是sprintf函数,因为它是无关紧要的该数字转换为字符类。 不幸的是,结果并没有按照我想要的顺序出现
测试数据框如下所示,前导0列作为第三列添加,以便于比较。通过运行代码可以看出,粘贴前导零号的顺序与原始数字顺序不对应
test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test[,3]<-sprintf("%04d", test[,2])
通过将原始数字列分类为字符,按字母顺序重新排列数据框顺序,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])
我可以通过Frankensteining togther来创建所需的数据集。
test.three <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.three[,3]<-test.two[,3]
但是我想知道我做错了什么方法会给我一些我希望从我认为简单的操作得到的结果!
答案 0 :(得分:4)
这是因为第二列是一个因素。
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