通过sparklyr

时间:2017-09-04 17:04:54

标签: r dplyr sparklyr

related question中,我有一些很好的帮助来生成一组或多个变量的可能组合。

假设该过程的输出为

combo_tbl <- sdf_copy_to(sc = sc,
                     x = data.frame(
                       combo_id = c("combo1", "combo2", "combo3"),
                       selection_1 = c("Alice", "Alice", "Bob"),
                       selection_2 = c("Bob", "Cat", "Cat")
                     ),
                     name = "combo_table")

这是对具有两列的火花数据框对象的tbl引用,每列代表从3(Alice,Bob,Cat)列表中选择的2个值,可以将其想象为3个家庭成员。 / p>

现在还有一个带有二进制编码的火花数据框,如果房子的成员在房子里,则表示1;如果房子的成员不在,则表示0。

obs_tbl <- sdf_copy_to(sc = sc,
                   x = data.frame(
                     obs_day = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"),
                     Alice = c(1, 1, 0, 1, 0, 1, 0),
                     Bob = c(1, 1, 1, 0, 0, 0, 0),
                     Cat = c(0, 1, 1, 1, 1, 0, 0)
                   ),
                   name = "obs_table")

我可以通过以下代码相对简单地检查房子中是否存在特定的一对:

obs_tbl %>%
  group_by(Alice, Bob) %>%
  summarise(n())

然而,这种方法存在两个缺陷。

  1. 当我需要检查的每个组合都在combo_tbl时,每个对都会被手动放入。
  2. 输出自动输出每个组合的交集。即我得到Alice和Bob == 1的值的计数,但也得到Alice == 1和Bob == 0,Alice == 0和Bob == 1等的值。
  3. 理想的最终结果是输出如下:

    Alice | Bob | 2
    Alice | Cat | 2
    Bob   | Cat | 2
    

    即。每对共同居住日数。

    完美的解决方案将允许简单的修改以改变组合内的选择数量以增加。即,每个combo_id可以从比给定的列表更大的列表中具有3个或更多个选择。

    那么,是否有可能在sparklyr上传递迭代通过的对向量? 我如何只检查我的选择在哪里?我应该使用矢量化group_by

    而不是矢量化filter

    我已经阅读了tidyverse中的quosures和标准评估。如果在本地运行,这是解决方案吗?如果是这样,那么火花会支持吗?

    供参考,我有一个使用data.table的相对类似的解决方案,可以在单机,非火花上下文中运行。一些伪代码:

    combo_dt[, obs_dt[get(tolower(selection_1)) == "1" &
                      get(tolower(selection_2)) == "1"
                              , .N], by = combo_id]
    

    这个嵌套过程有效地将每个组合拆分为它自己的子表:by = combo_id,然后为那个selection_1selection_2为1的子表过滤器,然后应用{ {1}}计算该子表中的行,然后聚合输出。

0 个答案:

没有答案