Вказівка ​​colClasses у read.csv


108

Я намагаюся вказати colClassesпараметри read.csvфункції у Р. У моїх даних перший стовпець "час" - це в основному вектор символів, а решта стовпців - числові.

data <- read.csv("test.csv", comment.char="" , 
                 colClasses=c(time="character", "numeric"), 
                 strip.white=FALSE)

У наведеній вище команді я хотів би, щоб R читав у стовпці "час" як "символ", а решта - як числовий. Хоча змінна "data" мала правильний результат після завершення команди, R повернув наступні попередження. Мені цікаво, як я міг виправити ці попередження?

Warning messages:
 1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
    not all columns named in 'colClasses' exist
 2: In tmp[i[i > 0L]] <- colClasses :
    number of items to replace is not a multiple of replacement length

Дерек

Відповіді:


78

Вектор ColClasses повинен мати довжину, рівну кількості імпортованих стовпців. Припустимо, що решта стовпців вашого набору даних 5:

colClasses=c("character",rep("numeric",5))

7
Можливо, можна скористатися наступним, щоб прочитати перший рядок csv та визначити, скільки там стовпців. сканування (csv, sep = ',', what = "персонаж", nlines = 1)
defoo

34
Це насправді неправильна відповідь і мене на деякий час відкинуло. Правильна відповідь наведена нижче. Не намагаючись бути ривком, просто хотів переконатися, що цього не трапиться ні з ким.
Роб

3
@Rob У моєму випадку це все-таки правильна відповідь, коли вам також потрібно вказати класи інших змінних, і вони автоматично не визнаються такими read.table.
чакраварти

173

Ви можете вказати ColClasse лише для одного стовпця.

Тож у своєму прикладі слід використовувати:

data <- read.csv('test.csv', colClasses=c("time"="character"))

21
Мало того, що це має велике значення, але я виявив, що це працює без цитування назви стовпця.
Хенді

Цей підхід насправді дуже корисний при спробі прочитати цитовані цілі числа як символи. Дякую!
nils-holmberg

14

Якщо припустити, що у стовпці "час" є принаймні одне спостереження з нечисловим символом, а всі інші стовпці мають лише цифри, тоді за замовчуванням "read.csv" буде читати "час" як "фактор", а всі інші стовпці як "числові". Тому встановлення "stringsAsFactors = F" матиме такий самий результат, що і встановлення "colClasses" вручну, тобто

data <- read.csv('test.csv', stringsAsFactors=F)

10

Якщо ви хочете посилатися на імена із заголовка, а не номери стовпців, ви можете використовувати щось подібне:

fname <- "test.csv"
headset <- read.csv(fname, header = TRUE, nrows = 10)
classes <- sapply(headset, class)
classes[names(classes) %in% c("time")] <- "character"
dataset <- read.csv(fname, header = TRUE, colClasses = classes)

4

Для кількох стовпців дати без заголовка та безлічі стовпців скажіть, що мої поля дат перебувають у стовпцях 36 та 38, і я хочу, щоб вони читалися як поля символів:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        

3

Я знаю, що ОП запитав про utils::read.csvфункцію, але дозвольте надати відповідь на ці, які приїжджають сюди, шукаючи, як це зробити за допомогою readr::read_csv"tidyverse".

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))

Це має встановити тип за замовчуванням для всіх стовпців як символ , а час буде розбиратися на ціле число.


0

Якщо ми поєднаємо те, що сприяли @Hendy та @Oddysseus Ithaca, ми отримаємо більш чистий та загальний (тобто пристосований?) Шматок коду.

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.