2011-10-30 18 views
5

Sto importando un file CSV a 3 colonne. La colonna finale è una serie di voci che sono o un numero intero o una stringa tra virgolette.Lettura file CSV, con numeri e stringhe in una colonna

Qui ci sono una serie di esempi di voci:

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

Quando importo questo usando read.csv, questi sono tutti appena compiuto per fattori.

Come posso impostarlo in modo che vengano letti come numeri interi e stringhe?

Grazie!

risposta

8

Questo non è possibile, poiché un dato vettore può avere solo una modalità singola (ad esempio character, numeric o logical).

Tuttavia, è possibile dividere il vettore in due vettori separati, uno con valori numerici e la seconda con valori di carattere:

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 hai detto la stessa cosa di me ma meglio. –

+0

@ user718281, da leggere come stringhe, non fattori, usa read.csv (..., stringheAsFactors = FALSE) – Max

+0

Grazie Andrie. Una cosa che non so bene come fare è però come passare dal file csv al vettore. Come in, è a mia conoscenza che read.csv emette una matrice, non un vettore. – evt

2

No. Un dataframe è una serie di vettori incollati insieme (un elenco di vettori o matrici). Poiché ogni colonna è un vettore, non può essere classificata sia come numero intero che come fattore. Deve essere l'uno o l'altro. È possibile dividere il vettore a parte in numerico e fattore (colonna per ogni) ma non credo che questo sia ciò che si desidera.

6

EDITNonostante la decisione dell'OP di accettare questa risposta, la risposta di @ Andrie è la soluzione preferita. La mia risposta è intesa solo per informare su alcune strane funzionalità dei frame di dati.

Come altri hanno sottolineato, la risposta breve è che questo non è possibile. data.frame s sono intesi per contenere colonne di un singolo tipo atomico. @ Il suggerimento di Andrie è buono, ma solo per i calci ho pensato di indicare un modo per calzare questo tipo di dati in un data.frame.

è possibile convertire la colonna incriminato per una lista (questo codice presuppone che hai impostato 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 

Ora, ci sono tutta una serie di motivi per cui questo è una cattiva idea. Per uno, un sacco di codice che ti aspetteresti di giocare bene con data.frame s non piacerà e fallirà, o si comporterà in modo molto strano. Ma pensavo di indicarlo come una curiosità.

+0

+1 Solo perché questa è una pessima idea! – Andrie

+0

Per quanto atroce sia, sto discutendo l'etica di uscire con qualcosa di peggio. :) – Iterator

+0

Hmm, in realtà, questo non è riproducibile per me. I valori di V3 sono 5,1,4,2,3 e le classi sono int, num, int, num, num. Risoluzione: 'opzioni (stringsAsFactors = FALSE)'. – Iterator

Problemi correlati