2017-10-20 4 views
4

Kann case_when() in dplyr eine Mischung aus NA und nicht Werte zurückgeben?Kann dplyr :: case_when eine Mischung aus NAs und Nicht-NAs zurückgeben?

Wenn ich frage es NA in Reaktion auf eine Anweisung zurück, aber ein nicht NA Wert in Antwort auf eine andere Aussage, wirft sie einen Bewertungsfehler:

Eg, ich will 1 für alle Werte von cyl >= 6, und NA für Werte von cyl < 6

> library("dplyr") 
> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ 1, cyl < 6 ~ NA)) 

Error in mutate_impl(.data, dots) : Evaluation error: must be type double, not logical.

Allein, beide der Aussagen bewerten in Ordnung.

Dieses Problem tritt nicht auf, wenn nach allen zurückgegebenen NAs gefragt wird, aber nicht nach einer Mischung aus NA s und nicht s.

z.B .: NA Return für alle Werte von cyl >= 6

> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ NA)) 
    cyl thing 
1 6 NA 
2 6 NA 
3 4 NA 

gut aussieht.

> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ NA, cyl < 6 ~ NA)) 
    cyl thing 
1 6 NA 
2 6 NA 
3 4 NA 

Kühl.

> mtcars[1:3,] %>% mutate(thing = case_when(cyl == 6 ~ 1, cyl < 6 ~ NA, cyl > 6 ~ NA)) 

Error in mutate_impl(.data, dots) : Evaluation error: must be type double, not logical.

Nicht cool.

Hinweis: Zur Verdeutlichung sind die zurückgegebenen Elemente in den Beispielen alle von mtcars[1:3,] mit %>% select(cyl, thing) am Ende des Ausdrucks.

Antwort

4

Hier ist das Problem mit class. Wir brauchen NA_real den numerischen Typ

mtcars[1:3,] %>% 
     mutate(thing = case_when(cyl == 6 ~ 1, 
           cyl < 6 ~ NA_real_, 
           cyl > 6 ~ NA_real_)) %>% 
     select(cyl, thing) 
# cyl thing 
# 6  1 
# 6  1 
# 4 NA 
+2

Yep

mtcars %>% mutate(thing = case_when(cyl >= 6 ~ 1, cyl < 6 ~ NA_real_)) 

Auch

für den zweiten Fall übereinstimmen, nachdem TFM * jetzt ein Dutzend Mal zu lesen * Ich sehe „All RHSS auf die bewerten müssen gleiche Art von Vektor. " –

Verwandte Themen