Sparklyr用字符串填充

时间:2019-01-18 11:53:49

标签: r sparklyr

我想在Sparklyr数据框中填充值(用以前的值替换NA),该字段包含字符串。

本质上,我想对此进行转换:

ID, String
1    a
2    NaN
3    b
4    NaN

对此:

ID, String
1    a
2    a
3    b
4    b

在sparklyr中有什么方法可以做到吗?

2 个答案:

答案 0 :(得分:0)

最近的软件包update for sparklyr包含fill,其行为与同名的tidyr函数相同。此外,我们可以查看SQL并直接应用LAST函数。在下面的示例中,我按“ grp”进行分区,因为我想对它进行分组,只需删除group_by / PARTITION BY即可不进行分组。

创建表格

a <- data.frame(vals = c(NA,NA,NA,1,NA,NA,NA,NA,NA,6,NA,NA,NA,10), row_num = 1:14, grp = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2))
b <- copy_to(con,a,"example", overwrite = TRUE)

在SQL中应用回填

c <- sdf_sql(con,"
    SELECT* 
    , LAST(vals, TRUE) OVER  (PARTITION BY grp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last_val
    FROM example
             ")

在sparklyr中应用反向填充

诚然,我在使用fill函数时遇到了一些麻烦,但这就是应该的方法。

c <- sdf_sql(con, "SELECT * FROM example")
c <- c %>% mutate(last_val = fill(val,.direction="down")

或者,您可以仅在肯定有效的mutate中应用SQL。

c <- sdf_sql(con, "SELECT * FROM example")
c <- c %>% mutate(last_val = sql("LAST LAST(vals, TRUE) OVER  (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)"))

答案 1 :(得分:-1)

这适用于您的示例:

library(sparklyr)
library(tidyverse)

sc <- spark_connect(master = "local")

df<-tibble(ID=c(1,2,3,4), String=c("a",NaN,"b",NaN))

tbl_df<-sdf_copy_to(sc,df,"tbl_df",overwrite = TRUE)

tbl_df<-tbl_df%>%mutate(String=ifelse(String=="NaN",lag(String,order = ID),String))

> glimpse(tbl_df)
Observations: ??
Variables: 2
$ ID     <dbl> 1, 2, 3, 4
$ String <chr> "a", "a", "b", "b"