Добавление ведущих нулей в столбец dataframe с помощью sprintf в R
У меня есть датафрейм, и я хочу, чтобы числовая переменная была длиной в четыре цифры. Чтобы сделать это, мне нужно добавить между 1-3 ведущими нулями, метод, который я выбрал, это функция sprintf, поскольку неважно, что число преобразуется в класс персонажа. К сожалению, результаты не выходят в том порядке, который я хочу
Фрейм тестовых данных сделан следующим образом, а ведущий столбец 0 добавлен в качестве третьего столбца, что упрощает сравнение. Как можно увидеть, запустив код, порядок, в который вставляются первые нулевые числа, не соответствует порядку исходных чисел.
test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test[,3]<-sprintf("%04d", test[,2])
изменяя порядок фреймов данных в алфавитном порядке, классифицируя столбец исходного числа как символы, номер спринта теперь находится в порядке возрастания, а номер серии - нет.
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.
test.three <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.three[,3]<-test.two[,3]
Однако я хотел бы знать, что я делаю неправильно и какой метод даст мне результат, который я ожидал получить от того, что я считал простой операцией!
1 ответ
Это связано с тем, что вторым столбцом является фактор.
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