84 votes

Changer la classe de facteur en numérique de nombreuses colonnes dans un bloc de données

Quel est le moyen le plus rapide / le meilleur pour changer un grand nombre de colonnes en numérique à partir d'un facteur?

J'ai utilisé le code suivant mais il semble avoir réorganisé mes données.

 > head(stats[,1:2])
  rk                 team
1  1 Washington Capitals*
2  2     San Jose Sharks*
3  3  Chicago Blackhawks*
4  4     Phoenix Coyotes*
5  5   New Jersey Devils*
6  6   Vancouver Canucks*

for(i in c(1,3:ncol(stats))) {
    stats[,i] <- as.numeric(stats[,i])
}

> head(stats[,1:2])
  rk                 team
1  2 Washington Capitals*
2 13     San Jose Sharks*
3 24  Chicago Blackhawks*
4 26     Phoenix Coyotes*
5 27   New Jersey Devils*
6 28   Vancouver Canucks*

Quelle est la meilleure façon, à moins de nommer chaque colonne comme dans:

 df$colname <- as.numeric(ds$colname)

74voto

Ramnath Points 24798

Vous devez être prudent lorsque vous modifiez les facteurs en numérique. Voici une ligne de code qui changerait un ensemble de colonnes de facteur en numérique. Je suppose ici que les colonnes à changer en numérique sont 1, 3, 4 et 5 respectivement. Vous pouvez le modifier en conséquence

 cols = c(1, 3, 4, 5);    
df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)));

40voto

Joris Meys Points 38980

Cela peut être fait en une seule ligne, il n'y a pas besoin de boucle, que ce soit une boucle for ou une application. Utilisez plutôt unlist ():

 # testdata
Df <- data.frame(
  x = as.factor(sample(1:5,30,r=TRUE)),
  y = as.factor(sample(1:5,30,r=TRUE)),
  z = as.factor(sample(1:5,30,r=TRUE)),
  w = as.factor(sample(1:5,30,r=TRUE))
)
##

Df[,c("y","w")] <- as.numeric(as.character(unlist(Df[,c("y","w")])))

str(Df)

Edit: pour votre code, cela devient:

 id <- c(1,3:ncol(stats))) 
stats[,id] <- as.numeric(as.character(unlist(stats[,id])))

Évidemment, si vous avez un bloc de données à une colonne et que vous ne voulez pas que la réduction de dimension automatique de R le convertisse en vecteur, vous devrez ajouter l'argument drop=FALSE

31voto

Dan Points 473

Je sais que cette question est résolue depuis longtemps, mais j'ai récemment eu un problème similaire et je pense avoir trouvé une solution un peu plus élégante et fonctionnelle, bien qu'elle nécessite le package magrittr.

 library(magrittr)
cols = c(1, 3, 4, 5)
df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)))

L'opérateur %<>% canalise et réaffecte, ce qui est très utile pour simplifier le nettoyage et la transformation des données. Maintenant, la fonction d'application de liste est beaucoup plus facile à lire, en spécifiant uniquement la fonction que vous souhaitez appliquer.

14voto

sbha Points 1948

Voici quelques options dplyr

 # by column type:
df %>% 
  mutate_if(is.factor, ~as.numeric(as.character(.)))

# by specific columns:
df %>% 
  mutate_at(vars(x, y, z), ~as.numeric(as.character(.))) 

# all columns:
df %>% 
  mutate_all(~as.numeric(as.character(.))) 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X