3 votes

Comportement de l'opérateur du tuyau R après transformation

J'ai du mal à comprendre le comportement de l'opérateur pipe ( |> dans la base R, mais j'ai le même problème avec la méthode de magrittr %>% ) lorsque j'applique une transformation dans l'une des étapes :

table(iris$Species) |> prop.table() |> round(1)

    setosa versicolor  virginica 
       0.3        0.3        0.3 

table(iris$Species) |> prop.table()*100 |> round(1)

    setosa versicolor  virginica 
  33.33333   33.33333   33.33333  

Pourquoi la deuxième commande ne transmet-elle pas le résultat à round ?

4voto

Anoushiravan R Points 4928

Il ne peut s'agir que d'une seconde alternative aux très bonnes solutions fournies par les chers @ktiu qui contient également quelques nouvelles fonctionnalités intéressantes. Nous pouvons utiliser multiply_by de la fonction magrittr qui fonctionne avec le pipe natif et le pipe magrittr :

library(magrittr)

table(iris$Species) |> prop.table() |> multiply_by(100) |> round(digits = 1)

    setosa versicolor  virginica 
      33.3       33.3       33.3

3voto

ktiu Points 71

Dans votre exemple, c'est seulement le 100 qui est transmis à round() -- donc cela n'affecte rien puisque 100 est déjà un nombre entier. La même chose se produit avec %>% .

Avec magrittr nous pouvons remédier à ce problème en appelant la commande * comme une fonction explicitement avec des backticks :

table(iris$Species) %>% prop.table() %>% `*`(100) %>% round(1)

Dans la base R, AFAIK, nous devons inclure une fonction anonyme pour multiplier :

table(iris$Species) |> prop.table() |> (\(x) x * 100)() |> round(1)

(Mais voir Réponse de Anoushiravan R pour une solution de contournement).

1voto

akrun Points 148302

Une autre option consiste à convertir en data.frame et utiliser transform

table(iris$Species) |> 
     prop.table() |> 
     as.data.frame() |>
     transform(Freq = round(Freq * 100, 1))

-ouptut

        Var1 Freq
1     setosa 33.3
2 versicolor 33.3
3  virginica 33.3

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