2
votes

Changer les types de colonnes avec dplyr

J'ai besoin d'aide pour ranger mes données. J'essaye de convertir certains entiers en facteurs (mais pas tous les entiers en facteurs). Je pense que je peux me contenter de sélectionner les variables en question, mais comment les rajouter à l'ensemble de données d'origine? Par exemple, en gardant les valeurs NON sélectionnées dans mon raw_data_tbl et en utilisant les types mutés de raw_data_tbl_int

entrez la description de l'image ici

entrez la description de l'image ici

    library(dplyr)

    raw_data_tbl %>% 
    select_if(is.numeric) %>% 
    select(-c(contains("units"), PRO_ALLOW, RTL_ACTUAL, REAL_PRICE, 
           REAL_PRICE_HHU, REBATE, RETURN_UNITS, UNITS_PER_CASE, Profit, STR_COST, DCC, 
           CREDIT_AMT)) %>% 
    mutate_if(is.numeric, as.factor)


2 commentaires

transformé_raw_data_tbl <- raw_data_tbl%>% mutate_at (vars (contient ("unités"), PRO_ALLOW, RTL_ACTUAL, REAL_PRICE, REAL_PRICE_HHU, REBATE, RETURN_UNITS, Profit, STR_COST, DCC, CREDIT_AMT>% funs) (as.atnumer) (vars (-contains ("units"), -PRO_ALLOW, -RTL_ACTUAL, -REAL_PRICE, -REAL_PRICE_HHU, -REBATE, -RETURN_UNITS, -Profit, -STR_COST, -DCC, -CREDIT_AMT), funs (comme facteur))


Ce code m'a amené là où je voulais être. Préserver le type entier des variables que je voulais conserver sous forme d'entiers et changer le reste en facteurs.


3 Réponses :


4
votes

Honnêtement, je le ferais comme ceci:

library(dplyr)

df = data.frame("LOC_ID" = c(1,2,3,4),
                "STRS" = c("a","b","c","d"),
                "UPC_CDE" = c(813,814,815,816))

df$LOC_ID = as.factor(df$LOC_ID)
df$UPC_CDE = as.factor(df$UPC_CDE)


3 commentaires

Vous n'avez pas besoin de dplyr pour apporter des modifications comme celle-ci


@DaveGruenewald C'est seulement là-dedans parce qu'OP l'avait dans son code. Vous avez bien sûr raison. FWIW, je pense que votre solution est meilleure et j'espérais qu'OP l'accepterait.


toujours fan de ne pas compter sur les packages lorsque vous n'êtes pas obligé de le faire, il y a donc un temps et une place pour nos deux solutions!



7
votes

Vous pouvez utiliser mutate_at à la place. Voici un exemple utilisant le dataframe iris :

> str(iris_factor)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: Factor w/ 35 levels "4.3","4.4","4.5",..: 9 7 5 4 8 12 4 8 2 7 ...
 $ Sepal.Width : Factor w/ 23 levels "2","2.2","2.3",..: 15 10 12 11 16 19 14 14 9 11 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Edit 08/2020

À partir de dplyr 0.8.0, funs () est obsolète. Utilisez plutôt list () , comme dans

library(dplyr)

iris_factor <- iris %>%
  mutate_at(vars(Sepal.Width, 
                 Sepal.Length), 
            list(factor))

Et la preuve:

library(dplyr)

iris_factor <- iris %>%
  mutate_at(vars(Sepal.Width, 
                 Sepal.Length), 
            funs(factor))


0 commentaires

3
votes

À partir de dplyr 1.0.0 publié le CRAN 2020-06-01, les fonctions de portée mutate_at () , mutate_if () et mutate_all () a été remplacé grâce au plus généralisable across () . Cela signifie que vous pouvez rester avec mutate () . Le billet d'introduction du blog d'avril explique pourquoi il a fallu si longtemps pour le découvrir.

Exemple de jouet:

library(dplyr)

raw_data_tbl %>% 
  mutate(across(c(is.numeric,
                  -contains("units"),
                  -c(PRO_ALLOW, RTL_ACTUAL, REAL_PRICE, REAL_PRICE_HHU,
                     REBATE, RETURN_UNITS, UNITS_PER_CASE, Profit,
                     STR_COST, DCC, CREDIT_AMT)),
                factor))

Dans votre cas, vous feriez ceci:

library(dplyr)

iris %>%
  mutate(across(c(Sepal.Width, 
                  Sepal.Length),
                factor))


0 commentaires