我想在Sparklyr数据框中填充值(用以前的值替换NA),该字段包含字符串。
本质上,我想对此进行转换:
ID, String
1 a
2 NaN
3 b
4 NaN
对此:
ID, String
1 a
2 a
3 b
4 b
在sparklyr中有什么方法可以做到吗?
答案 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)
c <- sdf_sql(con,"
SELECT*
, LAST(vals, TRUE) OVER (PARTITION BY grp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last_val
FROM example
")
诚然,我在使用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"