2011-10-30 15 views
5

Importación de un archivo CSV de 3 columnas. La columna final es una serie de entradas que son un entero o una cadena entre comillas.Lectura de un archivo csv con números y cadenas en una columna

Estas son una serie de ejemplos de entradas:

1,4,"m" 
1,5,20 
1,6,"Canada" 
1,7,4 
1,8,5 

Cuando importo esto utilizando read.csv, todos estos son simplemente entregados a factores.

¿Cómo puedo configurarlo para que se lean como enteros y cadenas?

¡Gracias!

Respuesta

8

Esto no es posible, ya que un vector determinado solo puede tener un modo único (por ejemplo, character, numeric o logical).

Sin embargo, se puede dividir el vector en dos vectores separados, uno con valores numéricos y la segunda con valores de caracteres:

vec <- c("m", 20, "Canada", 4, 5) 

vnum <- as.numeric(vec) 
vchar <- ifelse(is.na(vnum), vec, NA) 

vnum 
[1] NA 20 NA 4 5 

vchar 
[1] "m"  NA  "Canada" NA  NA  
+0

Andrie dijiste lo mismo que yo pero mejor. –

+0

@ user718281, para leer como cadenas, no como factores, use read.csv (..., stringsAsFactors = FALSE) – Max

+0

Gracias Andrie. Una cosa de la que no estoy muy seguro es cómo pasar del archivo csv al vector. Como en, entiendo que read.csv genera una matriz, no un vector. – evt

2

No. Una trama de datos es una serie de vectores pegadas juntas (una lista de vectores o matrices). Como cada columna es un vector, no se puede clasificar como un número entero y un factor. Debe ser uno o el otro. Podrías dividir el vector en numérico y factor (acolumn para cada uno) pero no creo que esto sea lo que quieres.

6

EDITA pesar de la decisión del OP de aceptar esta respuesta, la respuesta de @ Andrie es la solución preferida. Mi respuesta solo pretende informar sobre algunas características extrañas de los marcos de datos.

Como han señalado otros, la respuesta corta es que esto no es posible. data.frame s están destinados a contener columnas de un solo tipo atómico. La sugerencia de @ Andrie es buena, pero solo por las patadas, pensé que podría señalar una forma de calzar este tipo de datos en un data.frame.

Puede convertir la columna infractor a una lista (este código se supone que ha establecido options(stringsAsFactors = FALSE)):

dat <- read.table(textConnection("1,4,'m' 
1,5,20 
1,6,'Canada' 
1,7,4 
1,8,5"),header = FALSE,sep = ",") 

tmp <- as.list(as.numeric(dat$V3)) 
tmp[c(1,3)] <- dat$V3[c(1,3)] 
dat$V3 <- tmp 

str(dat) 
'data.frame': 5 obs. of 3 variables: 
$ V1: int 1 1 1 1 1 
$ V2: int 4 5 6 7 8 
$ V3:List of 5 
    ..$ : chr "m" 
    ..$ : num 20 
    ..$ : chr "Canada" 
    ..$ : num 4 
    ..$ : num 5 

Ahora, hay todo tipo de razones por qué esto es una mala idea. Por un lado, un montón de código que esperarías jugar muy bien con data.frame s no le gustará esto y fallará, o se comportará de manera muy extraña. Pero pensé que lo señalaría como una curiosidad.

+0

+1 ¡Solo porque esta es una mala idea! – Andrie

+0

Tan atroz como esto es, estoy debatiendo la ética de venir con algo peor. :) – Iterator

+0

Hmm, en realidad, esto no es reproducible para mí. Los valores de V3 son 5,1,4,2,3 y las clases son int, num, int, num, num. Resolución: 'options (stringsAsFactors = FALSE)'. – Iterator

Cuestiones relacionadas