2017-07-23 2 views
2

Quelle est la syntaxe Magrittr pour assigner une colonne Iris $ basée sur 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) 

Il en résulte:

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 
+2

Pourquoi ne pas simplement utiliser 'couper()'? –

+0

Pas vraiment pertinent pour le problème, mais vous n'avez pas besoin de 'which 'dans votre exemple, un vecteur de booléens fonctionne très bien. ('df $ val1 [df $ Petal.Length <1.52] <-" cake "') –

Répondre

1

La syntaxe exacte équivalent magrittr à 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és avec des alias de magrittr:

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: (! Sauf pour les tuyaux)

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 premiers sont strictement équivalent dans la base:

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 équivalent à 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 une fonction base tandis que mutate est une fonction dplyr mais ils fonctionnent de la même manière ici.

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

1

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 
+0

Je me suis retrouvé en ajoutant%>% facteur entre vos deux derniers)) –

+0

@ בנימןהגלילי Merci, j'étais juste curieux à ce sujet, il n'est pas sur le représentant – akrun

+1

vraiment merci, j'ai utilisé case_when tout le temps depuis que vous me l'avez montré. –