2016-07-29 23 views
19

Es scheint dplyr::case_when verhält sich nicht wie andere Befehle in einem dplyr::mutate Aufruf. Zum Beispiel:case_when in muate pipe

library(dplyr) 

case_when(mtcars$carb <= 2 ~ "low", 
      mtcars$carb > 2 ~ "high") %>% 
    table 

Werke:

. 
high low 
    15 17 

Aber setzen case_when in einer mutate Kette:

mtcars %>% 
    mutate(cg = case_when(carb <= 2 ~ "low", 
         carb > 2 ~ "high")) 

und Sie erhalten:

Error: object 'carb' not found 

während das funktioniert gut

mtcars %>% 
    mutate(cg = carb %>% 
      cut(c(0, 2, 8))) 
+1

Ja, wird es nicht. Überprüfen Sie den Abschnitt über 'case_when' [hier] (https://blog.rstudio.org/2016/06/27/dplyr-0-5-0/) und [this] (https://github.com/ hadley/dplyr/issues/1965) – Sumedh

+0

wie unten beschrieben, ist diese Ausgabe mit dplyr> 0.7.0 – SprengMeister

Antwort

16

Wir .$

mtcars %>% 
    mutate(cg = case_when(.$carb <= 2 ~ "low", .$carb > 2 ~ "high")) %>% 
    .$cg %>% 
    table() 
# high low 
# 15 17 
+0

sicher gegangen, ich bin vertraut mit dem Operator '.', aber es ist nicht notwendig für' cut', 'recode' etc ... – tomw

+3

@tomw Ich habe nur auf der von Ihnen gestellten Frage geantwortet und nach Sumedhs (gelöschter Post) ist das 'case_when' noch auf einer experimentellen Bühne, so dass einige der regulären Dinge, die auf anderen Funktionen funktionieren, möglicherweise nicht funktionieren Hier. – akrun

5

Mit Dank verwenden, um @sumedh: @hadley has explained, dass dies ein bekanntes Manko von case_when:

case_when() is still somewhat experiment and does not currently work inside mutate() . That will be fixed in a future version.

-1

Neben @ akrun Antwort oben , beachte, dass die schließende Klammer für die case_when()nicht auf eine eigene Zeile gesetzt werden kann .

Zum Beispiel funktioniert das OK:

mtcars %>% 
    mutate(cg = case_when(
     .$carb <= 2 ~ "low", .$carb > 2 ~ "high")) 

aber nicht:

mtcars %>% 
    mutate(cg = case_when(
     .$carb <= 2 ~ "low", .$carb > 2 ~ "high") 
    ) 
+2

Huh? Beides funktioniert gut für mich. Ich kann mir nicht vorstellen, dass der Parser Probleme mit so etwas haben würde (im Gegensatz zum zugrunde liegenden Evaluator). –

22

Ab Version 0.7.0 von dplyr, case_when Werke im mutate wie folgt:

library(dplyr) # >= 0.7.0 
mtcars %>% 
    mutate(cg = case_when(carb <= 2 ~ "low", 
         carb > 2 ~ "high")) 

Für weitere Informationen: http://dplyr.tidyverse.org/reference/case_when.html

+0

'dplyr' <' 0.7.0' würde von einer Fehlermeldung profitieren, die anzeigt, dass dies in '0.7.0' behoben ist und nicht in 'Fehler: Objekt' carb 'not found'. – earcanal