2017-02-10 2 views
1

J'ai beaucoup de données où toutes les données sont des caractères. Je peux deviner qu'une var contenant un nombre devrait être changée en un type de données numérique. J'ai des centaines de colonnes, donc je ne veux pas taper chacune d'elles pour changer afin de la changer. Existe-t-il un autre moyen d'automatiser ce processus et de scanner une colonne de données? Vérifiez si le caractère a une valeur numérique et remplacez-le par un type numérique à partir du type de caractère.R vérifier les valeurs de caractères pour le type de données numérique var et changer automatiquement

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) 

Je ne veux pas avoir à le faire pour chaque colonne/var

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

Je voudrais faire quelque chose comme ça

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

Répondre

3

Nous pouvons écrire une fonction avec la condition du nombre. Cela fonctionne en essayant as.numeric et en vérifiant si elle renvoie NA, si c'est le cas, cela signifie que la valeur ne peut pas être forcée à un chiffre non ambigu. Lorsque cela se produit, la fonction conserve la colonne telle quelle.

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

Je descendais les semblables 'sapply (noms) (df, fonction (x) une (is.na (as.numeric (as.character (df [x])))))' route – SymbolixAU

+0

Cela fonctionne. C'est une fonction pratique. –