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

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))

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"))

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)

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)

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"))                        

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.


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"))                        
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.