簡體   English   中英

編寫一個函數以與來自 sparklyr 的 spark_apply() 一起使用

[英]Writing a function to use with spark_apply() from sparklyr

test <- data.frame('prod_id'= c("shoe", "shoe", "shoe", "shoe", "shoe", "shoe", "boat", "boat","boat","boat","boat","boat"), 
               'seller_id'= c("a", "b", "c", "d", "e", "f", "a","g", "h", "r", "q", "b"), 
               'Dich'= c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
               'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44)
                )
test

       prod_id seller_id Dich price
 1     shoe         a    1   120
 2     shoe         b    0    20
 3     shoe         c    0    10
 4     shoe         d    0     4
 5     shoe         e    0     3
 6     shoe         f    0     4
 7     boat         a    0    30
 8     boat         g    0    43
 9     boat         h    1    56
10     boat         r    0    88
11     boat         q    0    75
12     boat         b    0    44

我想創建一個新列,它根據 Dich 的值獲取價格列中觀察值之間的差異,其中每個觀察值都取其與每個 prod_id 組中 Dich==1 的觀察值的差異。 這樣做的語法如下。

test %>% 
group_by(prod_id) %>% 
mutate(diff_p = if(any(Dich ==1)) price - price[Dich == 1] else NA)

       prod_id seller_id Dich price diff_p
 1     shoe         a    1   120      0
 2     shoe         b    0    20     -100
 3     shoe         c    0    10     -110
 4     shoe         d    0     4     -116
 5     shoe         e    0     3     -117
 6     shoe         f    0     4     -116
 7     boat         a    0    30     -26
 8     boat         g    0    43     -13
 9     boat         h    1    56       0
10     boat         r    0    88      32
11     boat         q    0    75      19
12     boat         b    0    44     -12

現在我想創建一個使用相同語法的函數,我可以在新數據幀上使用該函數並使用 sparklyr::spark_apply() 獲得相同的結果。

trans <- function(e) {e %>%
         group_by(prod_id) %>% 
         mutate(diff_p = if(any(Dich ==1)) price -price[Dich == 1] else NA)
         }

在他們的網站上,rstudio 討論了將 R 函數應用於 spark 對象的用法。

https://spark.rstudio.com/guides/distributed-r/

下面是一個縮放 spark 數據幀的所有列的函數示例。

 trees_tbl %>%
 spark_apply(function(e) scale(e))

我想知道如何以解釋用於 spark_apply() 的格式編寫上面的函數。 如果您能解釋如何在函數中包含 e 將會很有幫助,- e 代表什么?

所有的包都需要在 worker 中並且需要找到函數(但是%>%需要你告訴 worker library(magrittr) ),一種可行的方法是:

trans <- function(e) {
    library(magrittr)

    e %>%
        dplyr::group_by(prod_id) %>% 
        dplyr::mutate(diff_p = if(any(Dich ==1)) price -price[Dich == 1] else NA)
}

sparklyr::spark_apply(
  x = test_sf, 
  f = trans)
# Source: spark<?> [?? x 5]
   prod_id seller_id  Dich price diff_p
   <chr>   <chr>     <dbl> <dbl>  <dbl>
 1 shoe    a             1   120      0
 2 shoe    b             0    20   -100
 3 shoe    c             0    10   -110
 4 shoe    d             0     4   -116
 5 shoe    e             0     3   -117
 6 shoe    f             0     4   -116
 7 boat    a             0    30    -26
 8 boat    g             0    43    -13
 9 boat    h             1    56      0
10 boat    r             0    88     32
# … with more rows
# ℹ Use `print(n = ...)` to see more rows

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM