2016-06-08 14 views
7

Ho un frame di dati che costruisco come tale:Conversione colonna frame di dati da carattere a numerico

> yyz <- data.frame(a = c("1","2","n/a"), b = c(1,2,"n/a")) 

> apply(yyz, 2, class) 
     a   b 
"character" "character" 

Sto tentando di convertire l'ultima colonna a numerico pur mantenendo la prima colonna come un carattere. Ho provato questo:

> yyz$b <- as.numeric(as.character(yyz$b)) 
> yyz 
    a b 
    1 1 
    2 2 
    n/a NA 

Ma quando eseguo la classe apply mi mostra che sono entrambe classi di caratteri.

> apply(yyz, 2, class) 
     a   b 
"character" "character" 

Am I impostare il frame di dati che non va? O è il modo in cui R sta interpretando il frame dei dati?

+2

Si noti che 'classe (YYZ $ b)' rese ' "numerici"' in questo esempio. Pertanto la colonna * è * in effetti numerica. Come sottolineato da @akrun, l'apparente discrepanza tra le classi risulta dall'uso di 'apply()'. – RHertel

risposta

15

Se abbiamo bisogno di una sola colonna per essere numeric

yyz$b <- as.numeric(as.character(yyz$b)) 

Ma, se ha bisogno di tutte le colonne di cambiato in numeric, utilizzare lapply a ciclo su colonne e convertire in numeric convertendo prima a character classe come le colonne erano factor.

yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x))) 

Entrambe le colonne in post del PO sono factor causa della stringa "n/a". Questo potrebbe essere facilmente evitato durante la lettura del file utilizzando na.strings = "n/a" nella read.table/read.csv o se stiamo usando data.frame, possiamo avere character colonne con stringsAsFactors=FALSE (il valore predefinito è stringsAsFactors=TRUE)


Per quanto riguarda l'utilizzo di apply, converte il dataset su matrix e matrix può contenere solo una singola classe. Per controllare la class, abbiamo bisogno

lapply(yyz, class) 

O

sapply(yyz, class) 

o controllare

str(yyz) 
+0

Converte entrambe le colonne in numerico. Voglio solo che la colonna b sia numerica. Specificherò yyz $ b <- lapply (yyz $ b, function (x) as.numeric (as.character (x))), li trasformerà in liste – Dexstrum

+0

@Dexstrum È perché stai assegnando un elenco a una colonna . Se abbiamo bisogno solo di una singola colonna come numerica, usa la stessa sintassi di come hai fatto 'yyz $ b <- as.numeric (as.character (yyz $ b))' – akrun

+0

Per favore guarda di nuovo ciò che ho postato. L'ho già provato e non ha modificato la colonna in numerica. – Dexstrum

Problemi correlati