Указание colClasses в read.csv


108

Я пытаюсь указать colClassesпараметры read.csvфункции в R. В моих данных первый столбец «время» в основном представляет собой вектор символов, а остальные столбцы - числовые.

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 и определить, сколько столбцов там. scan (csv, sep = ',', what = "character", nlines = 1)
defoo

34
На самом деле это неправильный ответ, и он на какое-то время меня сбил с толку. Правильный ответ ниже. Не пытался быть придурком, просто хотел убедиться, что этого не случится ни с кем другим.
Роб

3
@Rob В моем случае это по-прежнему правильный ответ, когда вам также нужно указать классы других переменных, и они не распознаются как таковые автоматически read.table.
tchakravarty

173

Вы можете указать colClasse только для одного столбца.

Итак, в вашем примере вы должны использовать:

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

21
Не то чтобы это имеет большое значение, но я обнаружил, что это работает без указания имени столбца.
Hendy

Этот подход на самом деле очень полезен при попытке прочитать цитируемые целые числа как символы. Спасибо!
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

Для нескольких столбцов datetime без заголовка и большого количества столбцов, скажем, мои поля datetime находятся в столбцах 36 и 38, и я хочу, чтобы они читались как символьные поля:

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

3

Я знаю, что OP спрашивал об этой utils::read.csvфункции, но позвольте мне дать ответ тем, кто пришел сюда в поисках того, как это сделать, используя readr::read_csvtidyverse.

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.