2017-03-10 6 views
1

Soweit ich weiß, ist case_when() eine verallgemeinerte Version von ifelse().Wie kann ich case_when innerhalb dplyr mutate() -Funktion verwenden?

Allerdings verstehe ich nicht, wie Sie diese Funktion innerhalb dplyr::mutate() Funktion verwenden. Es hat früher mit githubs letzter Version von dplyr funktioniert, aber seit ich wieder bei der CRAN Version (0.5) bin, funktioniert es nicht mehr. Hat jemand eine Ahnung?

Hier ist mein reproduzierbares Beispiel:


library(devtools) 
library(tibble) 
library(dplyr) 
#> 
#> Attaching package: 'dplyr' 
#> The following objects are masked from 'package:stats': 
#> 
#>  filter, lag 
#> The following objects are masked from 'package:base': 
#> 
#>  intersect, setdiff, setequal, union 

tibble(
    group = c("A", "A", "A", "B", "B", "B"), 
    x = 1:6 
) %>% 
    mutate(
    y = ifelse(group == "A", -x, x) 
    ) 
#> # A tibble: 6 × 3 
#> group  x  y 
#> <chr> <int> <int> 
#> 1  A  1 -1 
#> 2  A  2 -2 
#> 3  A  3 -3 
#> 4  B  4  4 
#> 5  B  5  5 
#> 6  B  6  6 

tibble(
    group = c("A", "A", "A", "B", "B", "B"), 
    x = 1:6 
) %>% 
    mutate(
    y = case_when(
     group == "A" ~ -x, 
     TRUE ~ x 
    ) 
) 
#> Error in mutate_impl(.data, dots): object 'group' not found 

tibble(
    group = c("A", "A", "A", "B", "B", "B"), 
    x = 1:6 
) %>% 
    mutate_(
    .dots = list(
     "y" = lazyeval::interp( 
     ~ case_when(var1 == "A" ~ -var2, TRUE, var2), 
     var1 = as.name(group), 
     var2 = as.name(x) 
     ) 
    ) 
) 
#> Error in as.name(group): object 'group' not found 



devtools::session_info() 
#> Session info ------------------------------------------------------------- 
#> setting value      
#> version R version 3.3.2 (2016-10-31) 
#> system x86_64, linux-gnu   
#> ui  X11       
#> language (EN)       
#> collate C       
#> tz  <NA>       
#> date  2017-03-10 
#> Packages ----------------------------------------------------------------- 
#> package * version  date  source        
#> assertthat 0.1   2013-12-06 CRAN (R 3.2.2)      
#> backports 1.0.5  2017-01-18 cran (@1.0.5)      
#> DBI   0.6   2017-03-09 cran (@0.6)      
#> devtools * 1.12.0.9000 2017-03-07 Github (hadley/[email protected]90) 
#> digest  0.6.12  2017-01-27 cran (@0.6.12)      
#> dplyr  * 0.5.0  2016-06-24 CRAN (R 3.3.2)      
#> evaluate  0.10  2016-10-11 cran (@0.10)      
#> htmltools 0.3.5  2016-03-21 CRAN (R 3.2.3)      
#> knitr  1.15.1  2016-11-22 cran (@1.15.1)      
#> lazyeval  0.2.0.9000 2016-10-14 Github (hadley/[email protected]) 
#> magrittr  1.5   2014-11-22 CRAN (R 3.2.3)      
#> memoise  1.0.0.9001 2017-02-13 Github (hadley/[email protected]) 
#> pkgbuild  0.0.0.9000 2017-03-07 Github (r-pkgs/[email protected]) 
#> pkgload  0.0.0.9000 2017-03-07 Github (r-pkgs/[email protected]) 
#> R6   2.2.0  2016-10-05 cran (@2.2.0)      
#> Rcpp   0.12.9  2017-01-14 cran (@0.12.9)      
#> rmarkdown 1.3.9004 2017-03-09 Github (rstudio/[email protected]) 
#> rprojroot 1.2   2017-01-16 cran (@1.2)      
#> stringi  1.1.2  2016-10-01 CRAN (R 3.3.1)      
#> stringr  1.2.0  2017-02-18 cran (@1.2.0)      
#> tibble  * 1.2   2016-08-26 CRAN (R 3.2.3)      
#> withr  1.0.2  2016-06-20 CRAN (R 3.2.3)      
#> yaml   2.1.14  2016-11-12 cran (@2.1.14) 

Antwort

1

Dies funktioniert

tibble(
    group = c("A", "A", "A", "B", "B", "B"), 
    x = 1:6 
) %>% 
    mutate(y = case_when(.$group == "A" ~ -.$x, 
         TRUE ~ .$x)) 
0

Konvertierung den Datenrahmen zu einem data.table der case_when ermöglicht wie erwartet zu verhalten.

library(dplyr) 
library(data.table) 
library(dtplyr) 

tibble(
    group = c("A", "A", "A", "B", "B", "B"), 
    x = 1:6) %>% 
tbl_dt() %>% 
mutate(y = case_when(group == "A" ~ -x, 
        TRUE ~ x)) 
0

ich eine besondere Arbeit um gefunden - Es scheint, dass die Datenrahmen Rohrleitungen zu mutieren Anstatt es als erstes Argument einzubeziehen, können Sie case_when verwenden und es funktioniert wie erwartet.

Zum Beispiel funktioniert das:

df %>% mutate(new_var = case_when(old_var == 1 ~ TRUE, 
            TRUE ~ FALSE) 

Das funktioniert nicht:

mutate(df, new_var = case_when(old_var == 1 ~ TRUE, 
           TRUE ~ FALSE) 

(mit R 3.3.1, 0.5.0 dplyr)

Verwandte Themen