获取每个组的所有级别组合

Jir*_*Čep 3 expand combinations r

我有一个客户 ID 列表,每个 ID 都有他们使用的独特产品的列表。理论上最多可以有约 150 种独特的产品。

df <- tibble(ID = c(1,1,1,2,2,3,3,4),
             prod = c("Prod1", "Prod2", "Prod3", "Prod1", "Prod4", "Prod3", "Prod5", "Prod2"))
Run Code Online (Sandbox Code Playgroud)

由此,我需要获取每个 ID 的所有可能的产品组合,而不仅仅是最高级别(按 ID 分组)。也就是说,包括所有产品的组合(如 Expand_grid() 所做的那样),但也包括1,...,n 个元素的所有组合,其中n是 ID 具有的唯一产品的数量。

因此,最终数据集应如下所示:

df_results <- tibble(ID = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4),
                     combo = c("Prod1", "Prod2", "Prod3", "Prod1|Prod2", "Prod1|Prod3", "Prod2|Prod3", "Prod1|Prod2|Prod3",
                               "Prod1", "Prod4", "Prod1|Prod4",
                               "Prod3", "Prod5", "Prod3|Prod5",
                               "Prod2"))
Run Code Online (Sandbox Code Playgroud)

Maë*_*aël 6

规范答案的扩展:

\n
library(dplyr)\ndf %>% \n  group_by(ID) %>% \n  reframe(combo = as.character(do.call(c, lapply(seq_along(prod), \\(m) combn(x = prod, m = m, FUN = \\(x) paste(x, collapse = "|"))))))\n
Run Code Online (Sandbox Code Playgroud)\n
# A tibble: 14 \xc3\x97 2\n      ID combo            \n   <dbl> <chr>            \n 1     1 Prod1            \n 2     1 Prod2            \n 3     1 Prod3            \n 4     1 Prod1|Prod2      \n 5     1 Prod1|Prod3      \n 6     1 Prod2|Prod3      \n 7     1 Prod1|Prod2|Prod3\n 8     2 Prod1            \n 9     2 Prod4            \n10     2 Prod1|Prod4      \n11     3 Prod3            \n12     3 Prod5            \n13     3 Prod3|Prod5      \n14     4 Prod2           \n
Run Code Online (Sandbox Code Playgroud)\n

或者以 R 为基数:

\n
stack(tapply(df$prod, df$ID, \n       \\(prod) do.call(c, lapply(seq_along(prod), \\(m) combn(prod, m, FUN = \\(x) paste(x, collapse = "|"))))))[2:1]\n
Run Code Online (Sandbox Code Playgroud)\n