Как читать числовые значения как множители в R?

У меня есть кадр данных A, который имеет числовой столбец, например:

zip code
00601
00602
00607

и так далее.

Если я прочитаю это в R с помощью read.csv, они будут прочитаны как числовые объекты. Я хочу, чтобы они были факторами.

Я попытался преобразовать их обратно в фактор, используя

A <- as.factor(A)

Но это удаляет начальные нули и делает A похожим

zip code
601
602
607

Я не хочу это. Я хочу сохранить нули.


person Ayush Raj Singh    schedule 28.06.2013    source источник
comment
Вы уверены, что они числовые?   -  person Thomas    schedule 28.06.2013
comment
@Thomas, если он хранится в R как 00607, это точно не так. Это странно, потому что ОП говорит и they are read as numeric, и I have a data frame A which has numeric column like: zip code 00601 ....   -  person Michele    schedule 28.06.2013


Ответы (3)


Используйте colClasses в своем вызове read.csv, чтобы прочитать их как символ или фактор: read.csv(*, colClasses="factor").

person Hong Ooi    schedule 28.06.2013

Возможно, вам придется добавить ведущие нули, как в этом сообщении. Это сначала преобразуется в класс символов. Затем вы можете изменить это на множитель, который поддерживает начальные нули.

Пример

A <- data.frame("zip code"=c(00601,00602,00607))
class(A$zip.code) #numeric
A$zip.code <- sprintf("%05d", A$zip.code)
class(A$zip.code) #character
A$zip.code <- as.factor(A$zip.code)
class(A$zip.code) #factor

В результате чего:

> A$zip.code
[1] 00601 00602 00607
Levels: 00601 00602 00607

Запись A в виде файла .csv

write.csv(A, "tmp.csv")

приводит к

"","zip.code"
"1","00601"
"2","00602"
"3","00607"
person Marc in the box    schedule 28.06.2013
comment
Привет, Марк. Спасибо за альтернативное решение. Я знакомлюсь со многими функциями. Только одно сомнение, если я пишу этот фрейм данных с помощью write.csv(), zip.code берется как числовой вектор (он автоматически удаляет нули при запуске, независимо от того, является ли zip фактором или символом в консоли R). Как мне написать как есть (имеется в виду с нулями в начале)?? - person Ayush Raj Singh; 28.06.2013
comment
@AyushRajSingh - В моем случае, когда я пишу файл .csv, zip.code воспринимается как текст. Я добавил, как выглядит мой вывод в ответе. - person Marc in the box; 28.06.2013
comment
Я попробовал ваш тот же пример, но когда я его пишу, нули исчезают. В чем может быть проблема? Под записью: я имею в виду, когда я открываю его в Excel после использования write.csv(). - person Ayush Raj Singh; 28.06.2013
comment
Хорошо, это проблема Excel. В Excel на самом деле существует формат для почтовых индексов: Выделите столбец › Формат ячеек › Специальный › Почтовый индекс - person Marc in the box; 28.06.2013
comment
Потрясаящий человек. Спасибо большое. - person Ayush Raj Singh; 28.06.2013

все без текстового квалификатора читается (пытается) как числовое, поэтому проблема в основном заключается в том, чтобы узнать, как ваши данные (в случае 00607) хранятся в плоском текстовом файле. Если без классификатора текста, вы можете либо последовать предложению @Hong Ooi, либо использовать

read.csv(*, colClasses="character")

а затем соответствующим образом преобразовать каждый столбец (в случае, если вам не нужны/не нужны все из них в factor). Если у вас есть вектор символов (столбец data.frame), преобразовать его в фактор просто.

> zipCode <- c("00601", "00602", "00607")
> factor(zipCode)
[1] 00601 00602 00607
Levels: 00601 00602 00607
person Michele    schedule 28.06.2013