Especificando colClasses en read.csv

108

Estoy tratando de especificar las colClassesopciones en la read.csvfunción en R. En mis datos, la primera columna "tiempo" es básicamente un vector de caracteres mientras que el resto de las columnas son numéricas.

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

En el comando anterior, me gustaría que R lea en la columna "tiempo" como "carácter" y el resto como numérico. Aunque la variable "datos" tuvo el resultado correcto después de que se completó el comando, R devolvió las siguientes advertencias. Me pregunto cómo podría solucionar estas advertencias.

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
fuente

Respuestas:

78

El vector colClasses debe tener una longitud igual al número de columnas importadas. Suponiendo que el resto de las columnas de su conjunto de datos son 5:

colClasses=c("character",rep("numeric",5))
George Dontas
fuente
7
probablemente se pueda usar lo siguiente para leer la primera línea del csv y determinar cuántas columnas hay. scan (csv, sep = ',', what = "character", nlines = 1)
defoo
34
En realidad, esta es una respuesta incorrecta y me confundió por un tiempo. La respuesta correcta está a continuación. No estoy tratando de ser un idiota, solo quería asegurarse de que no le pasara a nadie más.
Rob
3
@Rob En mi caso, esta sigue siendo la respuesta correcta, cuando también necesita especificar las clases de las otras variables, y no son reconocidas automáticamente como tales por read.table.
tchakravarty
173

Puede especificar colClasse solo para una columna.

Entonces, en su ejemplo, debe usar:

data <- read.csv('test.csv', colClasses=c("time"="character"))
Etienne
fuente
21
No es que importe mucho, pero encontré que esto funciona sin citar el nombre de la columna.
Hendy
Este enfoque es realmente muy útil cuando se intenta leer enteros entre comillas como caracteres. ¡Gracias!
nils-holmberg
14

Suponiendo que su columna 'tiempo' tiene al menos una observación con un carácter no numérico y todas sus otras columnas solo tienen números, entonces el valor predeterminado de 'read.csv será leer en' tiempo 'como un' factor 'y todo el resto de las columnas como 'numéricas'. Por lo tanto, configurar 'stringsAsFactors = F' tendrá el mismo resultado que configurar las 'colClasses' manualmente, es decir,

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

Si desea hacer referencia a nombres del encabezado en lugar de números de columna, puede usar algo como esto:

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
fuente
4

Para varias columnas de fecha y hora sin encabezado y muchas columnas, digamos que mis campos de fecha y hora están en las columnas 36 y 38, y quiero que se lean como campos de caracteres:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        
Ulises Ítaca
fuente
3

Sé que OP preguntó sobre la utils::read.csvfunción, pero permítanme dar una respuesta para estos que vienen aquí buscando cómo hacerlo usando readr::read_csvel tidyverse.

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

Esto debería establecer el tipo predeterminado para todas las columnas como carácter , mientras que el tiempo se analizaría como un número entero.

elcortegano
fuente
0

Si combinamos lo que aportaron @Hendy y @Oddysseus Ithaca, obtenemos un fragmento de código más limpio y más general (es decir, ¿adaptable?).

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