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)
规范答案的扩展:
\nlibrary(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 = "|"))))))\nRun 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 \nRun Code Online (Sandbox Code Playgroud)\n或者以 R 为基数:
\nstack(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]\nRun Code Online (Sandbox Code Playgroud)\n