在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())
然而,这种方法存在两个缺陷。
combo_tbl
时,每个对都会被手动放入。理想的最终结果是输出如下:
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_1
和selection_2
为1的子表过滤器,然后应用{ {1}}计算该子表中的行,然后聚合输出。