Добавление ведущих нулей в столбец 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
Другие вопросы по тегам