2017-12-19 3 views
2

sd()をスパークデータフレーム内の単一の値に(Rのスパークルパッケージを介して)適用すると、それに基づいてフィルタリングできない欠損値欠損値。sparklyrは、単一の値で `sd`の欠損値をフィルタリングできません

誰かがこれを説明して良い解決策を提供できますか?

以下の例。


library(sparklyr) 
library(dplyr) 

sc <- spark_connect(master = "local") 
#> * Using Spark: 2.1.0 

x <- data.frame(grp = c("a", "a", "c"), x = c(1, 2, 3)) 

copy_to(sc, x, "tmp", overwrite = TRUE) 
#> # Source: table<tmp> [?? x 2] 
#> # Database: spark_connection 
#>  grp  x 
#> <chr> <dbl> 
#> 1  a  1 
#> 2  a  2 
#> 3  c  3 

x_tbl <- tbl(sc, "tmp") %>% group_by(grp) %>% mutate(x_sd = sd(x)) 

x_tbl 
#> # Source: lazy query [?? x 3] 
#> # Database: spark_connection 
#> # Groups: grp 
#>  grp  x  x_sd 
#> <chr> <dbl>  <dbl> 
#> 1  a  1 0.7071068 
#> 2  a  2 0.7071068 
#> 3  c  3  NaN 

x_tbl %>% filter(!is.na(x_sd)) %>% collect() 
#> # A tibble: 3 x 3 
#> # Groups: grp [2] 
#>  grp  x  x_sd 
#> <chr> <dbl>  <dbl> 
#> 1  a  1 0.7071068 
#> 2  a  2 0.7071068 
#> 3  c  3  NaN 

答えて

3

これはsparklyrとスパークの間の非互換性の問題です。 Sparkでは、NULLS(R NAと多少等価)とNaNsがあり、処理ルールはそれぞれ異なりますが、両方の値はとしてsparklyrにフェッチされます。あなたがisnanを使用する必要がNaNフィルタリングする

(R is.nanと混同しないでください):

x_tbl %>% filter(!isnan(x_sd)) %>% collect() 
# A tibble: 2 x 3 
# Groups: grp [1] 
    grp  x  x_sd 
    <chr> <dbl>  <dbl> 
1  a  1 0.7071068 
2  a  2 0.7071068 

より良い問題を説明するために:

df <- copy_to(sc, 
    data.frame(x = c("1", "NaN", "")), "df", overwrite = TRUE 
) %>% mutate(x = as.double(x)) 

df %>% mutate_all(funs(isnull, isnan)) 
# Source: lazy query [?? x 3] 
# Database: spark_connection 
     x isnull isnan 
    <dbl> <lgl> <lgl> 
1  1 FALSE FALSE 
2 NaN FALSE TRUE 
3 NaN TRUE FALSE 
関連する問題