【发布时间】:2018-04-11 22:34:07
【问题描述】:
我想要一个基于谓词跟踪集合中包含哪些项目的列。看来我应该能够通过 purrr accumulate 函数和 dplyr lead/lag 和 union/setdiff 函数的某种组合来做到这一点。
这可能是最好的表达方式:
input_df <- dplyr::data_frame(user = c("1", "1", "1", "1"),
item = c("a", "b", "a", "a"),
include = c(TRUE, TRUE, FALSE, TRUE))
output_df <- dplyr::data_frame(user = c("1", "1", "1", "1"),
set = list(
c("a"),
c("a", "b"),
c("b"),
c("a", "b")))
编辑:我非常接近。我需要找到一种方法来查找向量之间的“包差异”(而不是设置差异),以防用户包含、排除然后重新包含一个项目。
numbered_input_df <- input_df %>%
mutate(id = row_number())
include_df <- numbered_input_df %>%
filter(include == TRUE) %>%
mutate(include_set = purrr::accumulate(item, c)) %>%
select(user, id, include_set)
exclude_df <- numbered_input_df %>%
filter(include == FALSE) %>%
mutate(exclude_set = purrr::accumulate(item, c)) %>%
select(user, id, exclude_set)
numbered_input_df %>%
left_join(include_df) %>%
left_join(exclude_df) %>%
fill(include_set, exclude_set) %>%
mutate(set = map2(include_set, exclude_set, ~.x[! .x %in% .y]))
【问题讨论】:
-
所以你可以得到像
purrr::accumulate(input_df$item, c)这样的简单结果——相当于Reduce(c, input_df$item, accumulate=TRUE)——但是你在include的基础上分组的规则是什么? -
抱歉,我不确定我是否理解。我将对用户进行分组,并且对行进行排序,以便下一行直接在前一行之前。
-
由于这使得输出的每一行都取决于前一行输出,我不确定它是否以矢量化方式可行。很高兴被证明是错误的,但您可以编写一个
for()循环来执行此操作可能会更简单。