2017-10-04 5 views
1

Peut-être une question stupide, je veux recoder plusieurs variables dans un fichier avec plusieurs conditions.Recoder plusieurs variables en utilisant tidyverse dans R

Exemple de données:

library(tidyverse) 
s <- matrix(sample(1:15, 20, replace = TRUE), ncol = 4) 
s <- as_tibble(s) 

Ce qui donne quelque chose comme ceci:

# A tibble: 5 x 4 
    V1 V2 V3 V4 
    <int> <int> <int> <int> 
1 11  2  5 14 
2  5  4 15  5 
3 13 15  2  5 
4  7 13 15 11 
5 11  5 12  3 

Je veux recoder V1, V2, V3 avec ces conditions, et en laissant V4 égale: si la valeur est inférieur ou égal à 5 ​​obtenir 1, si la valeur est supérieure à 5 mais inférieure ou égale à 10, obtenir 2 et enfin si la valeur est supérieure à 10, obtenir 3.

La sortie doit ok comme ceci:

# A tibble: 5 x 4 
     V1 V2 V3 V4 
     <int> <int> <int> <int> 
    1 3  1  1  14 
    2 1  1  3  5 
    3 3  3  1  5 
    4 2  3  3  11 
    5 3  1  3  3 

Je sais appliquer au sujet, sapply, vapply, mais je voudrais recoder en utilisant les fonctions du package tidyverse et d'une manière élégante.

Merci d'avance!

+0

Jetez un oeil à 'mutate_at' dans dplyr. Il est conçu pour appliquer la même fonction à plusieurs colonnes que vous pouvez choisir comme bon vous semble. – MrFlick

Répondre

5

Pour développer le commentaire @MrFlick, vous pouvez utiliser mutate_at en conjonction avec la fonction case_when dans dplyr. Il ressemblerait à ceci:

s %>% 
    mutate_at(vars(V1:V3), 
      function(x) case_when(x <= 5 ~ 1, x <= 10 ~ 2, TRUE ~ 3)) 

cela vous donnera:

# A tibble: 5 x 4 
    V1 V2 V3 V4 
    <dbl> <dbl> <dbl> <int> 
1  3  1  3  6 
2  2  1  1  8 
3  2  3  1 14 
4  1  3  3 15 
5  1  2  3  7 
+0

Bien qu'il y ait une faute de frappe dans votre colonne V4 mais ça marche !!! Merci de m'avoir présenté la fonction mutate_at !!! –

+1

où est la faute de frappe? Voulez-vous dire que les chiffres sont différents? Si c'est le cas, c'est juste le fait que 'sample' a utilisé des nombres différents lors de la création de la matrice pour moi, puis quand vous l'avez fait. – tbradley

+1

Je viens de réaliser !!! Ça fonctionne bien!! –