2017-02-10 8 views
1

Ich habe viele Datenframes, in denen alle Daten Zeichen sind. Ich kann schätzen, dass ein Var, das eine Zahl enthält, zu einem numerischen Datentyp geändert werden sollte. Ich habe 100 Spalten, aber ich möchte nicht jedes einzelne eingeben, um es zu ändern, um es zu ändern. Gibt es eine andere Möglichkeit, diesen Prozess zu automatisieren und eine Datenspalte zu prüfen, ob das Zeichen einen numerischen Wert hat und es vom Zeichentyp in einen numerischen Typ ändert?R überprüfen Zeichenwerte für numerische und ändern var Datentyp automatisch

employee <- c('John Doe','Peter Gynn','Jolie Hope') 
salary <- c("21000", "23400", "26800") 
gender <- c("M", "M", "F") 
rank <- c("5", "109", "2") 

df <- data.frame(employee, salary, gender, rank) 

Ich will nicht diese haben für jede Spalte zu tun/var

df$rank <- as.numeric(df$rank) 

ich so etwas wie dieses

i <- sapply(df, is.vector.of.columns.contaning.numeric.values) 
df[i] <- lapply(df[i], as.numeric) 

Antwort

3

Wir sind mit einer Funktion schreiben können tun möchte die Nummer Bedingung. Es funktioniert, indem es as.numeric versucht und überprüft, ob es NA zurückgibt, wenn es tut, bedeutet das, dass der Wert zu einem eindeutigen numerischen nicht gezwungen werden kann. Wenn dies geschieht, behält die Funktion die Spalte unverändert bei.

smartConvert <- function(x) { 
    if(any(is.na(as.numeric(as.character(x))))) x else as.numeric(x) 
} 

df[] <- lapply(df, smartConvert) 
str(df) 
# 'data.frame': 3 obs. of 4 variables: 
# $ employee: Factor w/ 3 levels "John Doe","Jolie Hope",..: 1 3 2 
# $ salary : num 1 2 3 
# $ gender : Factor w/ 2 levels "F","M": 2 2 1 
# $ rank : num 3 1 2 
+0

Ich ging unter die ähnlich 'sapply (Namen (df), Funktion (x) jede (is.na (as.numeric (as.character (df [x])))))' Route – SymbolixAU

+0

Das funktioniert. Dies ist eine praktische Funktion. –

Verwandte Themen