2016-06-08 4 views
7

habe ich einen Datenrahmen, die ich als solches Konstrukt:Konvertieren von Datenrahmen Spalte von Zeichen zu numerischen

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

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

I die letzte Spalte in numerischen während zu konvertieren bin versucht, noch die erste Spalte als Charakter beibehalten wird. Ich habe das versucht:

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

Aber wenn ich die Anwendung Klasse ausführen zeigt es mir, dass sie beide Zeichen Klassen sind.

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

Richte ich den Datenrahmen falsch ein? Oder ist es die Art, wie R den Datenrahmen interpretiert?

+2

Beachten Sie, dass 'Klasse (yyz $ b)' Erträge ' "numerisch"' in diesem Beispiel. Daher ist die Spalte * tatsächlich numerisch. Wie von @akrun gezeigt, resultiert die offensichtliche Nichtübereinstimmung von Klassen aus der Verwendung von 'apply()'. – RHertel

Antwort

15

Wenn wir nur eine Spalte sein müssen numeric

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

Aber, wenn alle Spalten auf numeric geändert werden müssen, verwenden lapply über die Spalten in einer Schleife und konvertieren zu numeric, indem sie zuerst zu character Klasse Umwandlung als die Spalten waren factor.

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

Sowohl die Spalten in der Post OP sind factor wegen der Zeichenfolge "n/a". Diese leicht vermieden werden könnte, während das Lesen der Datei mit na.strings = "n/a" im read.table/read.csv oder wenn wir data.frame verwenden, wir character Spalten mit stringsAsFactors=FALSE haben können (die Standardeinstellung ist stringsAsFactors=TRUE)


In Bezug auf die Verwendung von apply, wandelt es die Datensatz zu matrix und matrix kann nur eine einzige Klasse enthalten. Um die class zu überprüfen, müssen wir

lapply(yyz, class) 

Oder

sapply(yyz, class) 

Oder schauen Sie

str(yyz) 
+0

Dies konvertiert beide Spalten in numerisch. Ich möchte nur, dass Spalte b numerisch ist. Ich spezifiziere yyz $ b <- lapply (yyz $ b, Funktion (x) as.numerisch (as.character (x))), es verwandelt sie in Listen – Dexstrum

+0

@Dexstrum Das liegt daran, dass Sie einer Spalte eine Liste zuweisen . Wenn wir nur eine einzelne Spalte als numerisch benötigen, verwenden Sie die gleiche Syntax wie Sie 'yyz $ b <- as.numeric (as.character (yyz $ b))' – akrun

+0

Bitte schauen Sie sich noch einmal an, was ich gepostet habe. Ich habe das schon ausprobiert und die Spalte nicht auf numerisch geändert. – Dexstrum

Verwandte Themen