问题描述
我是R的新手,正试图在sparkR中重写R代码。在名为 costTbl 的data.table上的操作之一(还有5列)是
costTbl[,cost:=na.locf(cost,na.rm=FALSE),by=product_id]
costTbl[,na.rm=FALSE,fromLast=TRUE),by=product_id]
我无法在sparkR中找到等效的操作。我认为可以通过将product_id上的df分组并执行此操作来使用gapply。但是我无法使代码正常工作。
解决方法
从一些虚拟数据开始。
library(SparkR)
library(magrittr)
df <- createDataFrame(data.frame(
time = c(1,2,3,1,3),product_id = c(1,2),cost = c(1,NA,NA)
))
将last
与na.rm = TRUE
和适当的窗口规范一起使用。
df %>%
mutate(
cost = over(
last("cost",na.rm = TRUE),windowPartitionBy("product_id") %>% orderBy("time") %>% rowsBetween(Window.unboundedPreceding,0)
)
) %>%
collect()
#> time product_id cost locf_cost
#> 1 1 1 1 1
#> 2 2 1 2 2
#> 3 3 1 NA 2
#> 4 1 2 NA NA
#> 5 2 2 2 2
#> 6 3 2 NA 2
,
我终于可以使用SparkR UDF使用现有的本机R代码执行locf。
通过将我的数据框分组在列product_id
上,我们可以在此用例中使用gapply。
在这里分享了我的发现:https://homeassistant.io