Especificando colClasses no read.csv

108

Estou tentando especificar as colClassesopções na read.csvfunção em R. Em meus dados, a primeira coluna "tempo" é basicamente um vetor de caracteres, enquanto o resto das colunas são numéricas.

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

No comando acima, gostaria que R lesse na coluna "hora" como "caractere" e o resto como numérico. Embora a variável "data" tenha obtido o resultado correto após a conclusão do comando, R retornou os seguintes avisos. Estou me perguntando como posso corrigir esses avisos?

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

Derek

defoo
fonte

Respostas:

78

O vetor colClasses deve ter comprimento igual ao número de colunas importadas. Supondo que o resto das colunas do seu conjunto de dados sejam 5:

colClasses=c("character",rep("numeric",5))
George Dontas
fonte
7
provavelmente pode-se usar o seguinte para ler a primeira linha do csv e determinar quantas colunas existem. scan (csv, sep = ',', what = "personagem", nlines = 1)
defoo
34
Na verdade, esta é uma resposta incorreta e me confundiu um pouco. A resposta correta está abaixo. Não estou tentando ser um idiota, só queria ter certeza de que isso não aconteceria com mais ninguém.
Rob
3
@Rob No meu caso, esta ainda é a resposta correta, quando você também precisa especificar as classes das outras variáveis, e elas não são automaticamente reconhecidas como tal por read.table.
tchakravarty
173

Você pode especificar o colClasse para apenas uma coluna.

Portanto, em seu exemplo, você deve usar:

data <- read.csv('test.csv', colClasses=c("time"="character"))
Etienne
fonte
21
Não que isso importe muito, mas descobri que isso funcionou sem citar o nome da coluna.
Hendy,
Esta abordagem é realmente muito útil ao tentar ler inteiros entre aspas como caracteres. Obrigado!
nils-holmberg
14

Supondo que sua coluna 'tempo' tenha pelo menos uma observação com um caractere não numérico e todas as outras colunas tenham apenas números, então o padrão de 'read.csv será ler em' tempo 'como um' fator 'e todo o resto as colunas como 'numéricas'. Portanto, definir 'stringsAsFactors = F' terá o mesmo resultado que definir 'colClasses' manualmente, ou seja,

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

Se quiser se referir a nomes do cabeçalho em vez de números de coluna, você pode usar algo assim:

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)
Scentoni
fonte
4

Para várias colunas datetime sem cabeçalho e muitas colunas, digamos que meus campos datetime estão nas colunas 36 e 38 e eu quero que eles sejam lidos como campos de caracteres:

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

Eu sei que o OP perguntou sobre a utils::read.csvfunção, mas deixa eu dar uma resposta para esses que vêm aqui pesquisando como fazer usando readr::read_csvdesde o tidyverse.

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

Isso deve definir o tipo padrão para todas as colunas como caractere , enquanto o tempo seria analisado como inteiro.

elcortégano
fonte
0

Se combinarmos com o que @Hendy e @Oddysseus Ithaca contribuíram, ficamos mais limpos e com um pedaço de código mais geral (isto é, adaptável?).

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