Poniższy kod rzuca błąd podczas oceny linii za pomocą zalą.

library(data.table)
library(dplyr)
tbl.test <- data.table(x = 0.5*(1:2))
tbl.test[, .(fcase(x < 1, x+1, 
                 default = x))]

tbl.test[, .(case_when(x < 1 ~ x+1, 
                        TRUE ~ x)
             )]

Kiedy używam w ten sposób (dla większości skomplikowanych rzeczy ..), chciałem przełączyć się na wtyczkę, mając nadzieję na prawdziwy zysk w wydajności ..

Czy ktoś widzi, gdzie diabeł ukrywa się z tym użyciem w zestawie? Chodzi o to, że nie mogę użyć kolumny mojego stołu jako wartości domyślnej z walnikiem ..

0
MrSmithGoesToWashington 23 listopad 2020, 13:49

1 odpowiedź

Najlepsza odpowiedź

Nie stwierdzasz wyraźnie pytanie, ale zakładam, że chcesz wiedzieć, czy istnieje sposób, aby użyć wartości domyślnej Vectorized z {x0}}. Jednym ze sposobów, aby to zrobić, by skonstruować wektor TRUE s o równej długości do innych warunków jako ostatni element, podobnie jak w jaki sposób case_when() działa:

library(data.table)
library(dplyr)

set.seed(123)

tbl.test <- data.table(x = rnorm(1e6))

bench::mark(
  fcase = tbl.test[, .(fcase(x < 1, x + 1, rep_len(TRUE, length(x)), x))],
  case_when = tbl.test[, .(case_when(x < 1 ~ x + 1, TRUE ~ x))]
)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
#> # A tibble: 2 x 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 fcase        16.5ms   24.3ms     33.3     36.1MB     43.1
#> 2 case_when   146.4ms  147.9ms      6.60   129.9MB     28.1
2
Mikko Marttila 23 listopad 2020, 14:08