3

我是 R 新手,试图在 sparkR 中重写 R 代码。名为costTbl的 data.table 上的操作之一(它有 5 个其他列)是

costTbl[,cost:=na.locf(cost,na.rm=FALSE),by=product_id]
costTbl[,cost:=na.locf(cost,na.rm=FALSE, fromLast=TRUE),by=product_id]

我无法在 sparkR 中找到等效的操作。我认为可以通过对 product_id 上的 df 进行分组并执行此操作来使用 gapply。但我无法使代码工作。

gapply是正确的方法吗?还有其他方法可以实现这一目标吗?

4

2 回答 2

0

从一些虚拟数据开始。

library(SparkR)
library(magrittr)

df <- createDataFrame(data.frame(
  time = c(1, 2, 3, 1, 2, 3),
  product_id = c(1, 1, 1, 2, 2, 2),
  cost = c(1, 2, NA, NA, 2, NA)
))

lastna.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
于 2020-11-05T12:58:46.190 回答
0

我终于能够使用 SparkR UDF 使用现有的本机 R 代码执行 locf。我们可以在这个用例中使用 gapply,方法是将我的数据框分组到 column 上product_id

在这里分享了我的发现:https ://shbhmrzd.medium.com/stl-and-holt-from-r-to-sparkr-1815bacfe1cc

于 2020-11-13T17:20:29.110 回答