2 votes

Assignation conditionnelle frame$col <- val avec magrittr

Quelle est la syntaxe de Magrittr pour affecter Iris$column en fonction de Iris$Petal.Length ? Exemple sans Magrittr :

df      <- iris[47:56,]
df$val1 <- NA                                           ## create column
df$val1[which(df$Petal.Length < 1.52)]                         <- "cake"
df$val1[which(df$Petal.Length > 1.55 & df$Petal.Length <=4.55)] <- "pie"
df$val1[which(df$Petal.Length > 4.55)]                        <- "apple"

head(df)

Cela se traduit par :

Petal.Length Petal.Width  Species    val1

1.6                0.2     setosa     pie

1.4                0.2     setosa     cake

1.5                0.2     setosa     cake

1.4                0.2     setosa     cake

1.4                1.4.  versicolor   apple

1voto

akrun Points 148302

Nous pouvons utiliser case_when

res <- df %>% 
          mutate(val1 = case_when(Petal.Length < 1.52 ~ 'cake',
                  Petal.Length > 1.55 & Petal.Length <= 4.55 ~ 'pie',
                   Petal.Length > 4.55 ~'apple'))
head(res, 5)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species  val1
#1          5.1         3.8          1.6         0.2     setosa   pie
#2          4.6         3.2          1.4         0.2     setosa  cake
#3          5.3         3.7          1.5         0.2     setosa  cake
#4          5.0         3.3          1.4         0.2     setosa  cake
#5          7.0         3.2          4.7         1.4 versicolor apple

1voto

Moody_Mudskipper Points 18115

L'équivalent exact magrittr La syntaxe de ce que vous avez écrit est :

df %>% transform(val1 = NA) %$%
  inset(.,Petal.Length < 1.52,"val1","cake") %$%
  inset(.,Petal.Length > 1.55 & Petal.Length <= 4.55,"val1","pie") %$%
  inset(.,Petal.Length > 4.55,"val1","apple")

Ou pour être vraiment zélé avec magrittr Les pseudonymes de l'entreprise :

df %>% transform(val1 = NA) %$%
  inset(.,Petal.Length %>% is_less_than(1.52),"val1","cake") %$%
  inset(.,Petal.Length %>% is_greater_than(1.55) & Petal.Length %>% 
  is_weakly_less_than(4.55),"val1","pie") %$%
  inset(.,Petal.Length %>% is_greater_than(4.55),"val1","apple")

Et une variante :

df %>% transform(val1 = NA) %$%
  inset(.,Petal.Length %>% is_less_than(1.52),"val1","cake") %$%
  inset(.,Petal.Length %>% {is_greater_than(.,1.55) & is_weakly_less_than(.,4.55)},"val1","pie") %$%
  inset(.,Petal.Length %>% is_greater_than(4.55),"val1","apple")

Les deux premières sont strictement équivalentes à celle-ci en base (sauf pour les tuyaux !) :

df %>% transform(val1 = NA) %$%
  `[<-`(.,Petal.Length < 1.52,"val1","cake") %$%
  `[<-`(.,Petal.Length > 1.55 & Petal.Length <= 4.55,"val1","pie") %$%
  `[<-`(.,Petal.Length > 4.55,"val1","apple")

La variante est équivalente à ceci :

df %>% transform(val1 = NA) %$%
  `[<-`(.,Petal.Length < 1.52,"val1","cake") %$%
  `[<-`(.,Petal.Length %>% {`>`(.,1.55) & `<=`(.,4.55)},"val1","pie") %$%
  `[<-`(.,Petal.Length > 4.55,"val1","apple")

J'ai utilisé transform parce que c'est un base fonction pendant que mutate es un dplyr mais ils fonctionnent de la même manière ici.

Pour une définition de tous les alias, voir : ?extract

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