sparklyr 无法在单个值上过滤 `sd` 的缺失值
sparklyr can't filter missing value of `sd` on single value
将 sd()
应用于 spark 数据框中的单个值(通过 R 中的 sparklyr 包)会导致缺失值无法根据它是缺失值来过滤掉。
有人可以解释一下/提供一个好的解决方案吗?
示例如下。
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
这是sparklyr
和Spark不兼容的问题。在 Spark 中有 NULLS
(有点等同于 R NA
)和 NaNs
,每个都有不同的处理规则,但是这两个值在 [=14= 中被提取为 NaN
].
要过滤掉 NaN
,您必须使用 isnan
(不要将其与 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
将 sd()
应用于 spark 数据框中的单个值(通过 R 中的 sparklyr 包)会导致缺失值无法根据它是缺失值来过滤掉。
有人可以解释一下/提供一个好的解决方案吗?
示例如下。
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
这是sparklyr
和Spark不兼容的问题。在 Spark 中有 NULLS
(有点等同于 R NA
)和 NaNs
,每个都有不同的处理规则,但是这两个值在 [=14= 中被提取为 NaN
].
要过滤掉 NaN
,您必须使用 isnan
(不要将其与 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