2014-10-15 9 views
8

Ich habe eine gemischte Klasse Datenrahmen (numerisch und Faktor), wo ich versuche, den gesamten Datenrahmen in numerische konvertieren. Im Folgenden wird die Art der Daten, ich arbeite mit als auch das Problem, das ich bin der Begegnung:Wie konvertiert man das gesamte Datenfeld in einen numerischen Wert, während Dezimalzahlen beibehalten werden?

> a = as.factor(c(0.01,0.02,0.03,0.04)) 
> b = c(2,4,5,7) 
> df1 = data.frame(a,b) 
> class(df1$a) 
[1] "factor" 
> class(df1$b) 
[1] "numeric" 

Wenn ich den gesamten Datenrahmen in numerische versuchen und konvertieren, es ändert sich die numerischen Werte. Zum Beispiel:

> df2 = as.data.frame(sapply(df1, as.numeric)) 
> class(df2$a) 
[1] "numeric" 
> df2 
    a b 
1 1 2 
2 2 4 
3 3 5 
4 4 7 

Vorherige Beiträge auf dieser Website vorschlagen as.numeric(as.character(df1$a)) verwenden, die für eine Spalte funktioniert gut. Ich muss diesen Ansatz jedoch auf einen Datenrahmen anwenden, der Hunderte von Spalten enthalten kann.

Was sind meine Optionen für die Konvertierung eines ganzen Datenrahmens von Faktor zu numerisch, während die numerischen Dezimalwerte beibehalten werden?

Im Folgenden ist der Ausgang I produzieren möchte, wo a und b sind numerisch:

 a b 
1 0.01 2 
2 0.02 4 
3 0.03 5 
4 0.04 7 

ich die folgenden verwandten Beiträge gelesen haben, obwohl keiner von ihnen direkt auf diesen Fall anzuwenden:

  1. How to convert a factor variable to numeric while preserving the numbers in R Dies verweist auf eine einzelne Spalte in einem Datenrahmen.
  2. converting from a character to a numeric data frame. Dieser Beitrag berücksichtigt keine Dezimalwerte.
  3. How can i convert a factor column that contains decimal numbers to numeric?. Dies gilt nur für eine Spalte in einem Datenrahmen.
+3

Gute Möglichkeit, eine Frage zu stellen. [Diese Frage] (http://stackoverflow.com/questions/23206700/sum-on-a-factor-column-returns-incorrect-result) kann hilfreich sein. Dies ist eine häufige Quelle der Frustration mit Faktorvariablen. – ilir

Antwort

7

Möglicherweise müssen einige Kontrollen tun. Sie können Faktoren nicht direkt in Zahlen umwandeln. as.character muss zuerst angewendet werden. Andernfalls werden die Faktoren in ihre numerischen Speicherwerte konvertiert. Ich würde jede Spalte mit is.factor überprüfen und dann bei Bedarf auf numerisch umstellen.

df1[] <- lapply(df1, function(x) { 
    if(is.factor(x)) as.numeric(as.character(x)) else x 
}) 
sapply(df1, class) 
#   a   b 
# "numeric" "numeric" 
+0

Oder tun Sie es außerhalb der Schleife: 'is_factor <- vapply (df1, is.factor, logisch (1)); df1 [is_factor] <- ...' – hadley

+0

@hadley - Ich habe mich darüber gewundert. Es ist effizienter, zuerst zu überprüfen und dann die Änderung an der Teilmenge auszuführen? Anstatt in der 'lapply'-Schleife nachzusehen? –

+0

Angesichts der Größe des typischen Datensatzes bezweifle ich, dass es viel Unterschied machen würde – hadley

1
> df2 <- data.frame(sapply(df1, function(x) as.numeric(as.character(x)))) 
> df2 
    a b 
1 0.01 2 
2 0.02 4 
3 0.03 5 
4 0.04 7 
> sapply(df2, class) 
     a   b 
"numeric" "numeric" 
+1

Ich könnte falsch liegen, aber wird dies nicht eine numerische Spalte in Zeichen und dann wieder in numerische konvertieren? –

+0

@RichardScriven denke, das ist richtig. Ich denke, meine Antwort leidet unter dem gleichen Problem, obwohl ich denke, dass es nicht besonders problematisch ist. – n8sty

+0

@ n8sty Nein, es ist überhaupt nicht problematisch, aber es scheint ein wenig verschwenderisch. –

1
df2 <- data.frame(apply(df1, 2, function(x) as.numeric(as.character(x)))) 
1

Mit dplyr (ein bisschen wie sapply ..)

df2 <- mutate_all(df1, function(x) as.numeric(as.character(x))) 

die gibt:

glimpse(df2) 
Observations: 4 
Variables: 2 
$ a <dbl> 0.01, 0.02, 0.03, 0.04 
$ b <dbl> 2, 4, 5, 7 

von Ihrem df1 das war:

glimpse(df1) 
Observations: 4 
Variables: 2 
$ a <fctr> 0.01, 0.02, 0.03, 0.04 
$ b <dbl> 2, 4, 5, 7 
Verwandte Themen