2017-10-20 57 views
4

可以case_when()dplyr返回NA和非NA值的混合?可否dplyr :: case_when返回NAs和非NAs的混合?

當我問它響應返回NA一個聲明,但在回答另一個語句中的非NA值時,它拋出一個計算錯誤:

例如,我想1cyl >= 6所有值,和NAcyl < 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.

當家值,這兩個聲明的評價很好。

如果要求返回所有的NAs,但不是NA s和非NA s的混合物,則不存在此問題。

例如: - 返回NA所有值的cyl >= 6

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

看起來不錯。

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

很酷。

> 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.

不冷靜。

NB:爲清楚起見,在實施例中返回的項目全部從mtcars[1:3,]%>% select(cyl, thing)在表達式的結尾。

回答

4

這是class的問題。我們需要NA_real

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

同時匹配數值類型,對於第二種情況

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

沒錯,閱讀TFM了十幾次*現在*我看到「所有RHSS必須評估到後相同類型的矢量「。 –