2017-05-02 4 views
0

ich in meinem Dataset versuchen einige Faktorvariablen, und ich habe sie numerisch zu konvertieren mit SchleifeSchleife zu konvertieren Faktoren in numerische

a = sample(c('a', 'b'), 100, replace = TRUE) 
b = sample(c('a', 'b'), 100, replace = TRUE) 
df = as.data.frame(cbind(a, b)) 
library(plyr); library(dplyr) 
for(i in df[, 1:2]) { 

    k = as.numeric(as.character(revalue(df[,i], 
              c('a' = 1, 
              'b'= 2 
              )))) 
} 

und ich bekomme Fehler

Error in revalue(df[, i], c(a = "1", b = "2")) : 
    x is not a factor or a character vector. 

Was ist los? NB Es ist wichtig, dass 'a' bis 1 & 'b' = 2

+0

Sie 'tun wollen (df ​​[, 1: 2])) 'anstelle von' für (i in df [, 1: 2]) ' –

+1

Für Ihre Beispieldaten einfach' df $ a <- as.numeric (df $ a) 'und 'df $ b <- as.numeric (df $ b)' funktioniert. – neilfws

Antwort

2

Wie immer hat R Funktionalität eingebaut, diese Art der Zuordnung keine Probleme zu tun: (: 2 i in 1) `(oder alternativ` for (i in seq_along für

df[] <- lapply(df, function(x) c(a=1,b=2)[as.character(x)]) 
1

Sie brauchen nicht eine Schleife für die zB gleich ist:

library(plyr) 
as.data.frame(sapply(df, mapvalues,from = c("a", "b"),to = c(1, 2))) 

Und:

df2$a <- as.numeric(as.character(df2$a)) 
df2$b <- as.numeric(as.character(df2$b)) 
class(df2$a) 
[1] "numeric" 
+0

es ist eine gute Lösung, aber wir bekommen wieder Faktorvariablen. Im realen Datensatz habe ich 40 Variablen))) – Edward

1

Nur um dies zu verdeutlichen: Ein Datenrahmen ist eine Liste, und lapply ist oft eine gute Lösung, um Dinge in Listen zu tun. ;) Zum Beispiel könnten Sie versuchen:

df[] <- lapply(df, function(x){ 
    if(is.factor(x)) return(revalue(x, c('a' = 1, 'b'= 2))) 
    else return(x) 
} ) 

Dieser Code führt Folgendes aus: für jede Spalte, überprüft er, ob die Spalte ein Faktor. Wenn es sich um einen Faktor handelt, wird es entsprechend Ihrem Zustand umgeschrieben. Wenn es kein Faktor ist, werden die Daten unverändert gelassen. Sie können auch die Funktion ändern, die an lapply geliefert wird, um mehr "aufwendige" Dinge zu tun.

+1

Ah, so ist es ... – Gregor

Verwandte Themen