从列表中生成树

3

我正在使用R编程语言。

假设我有一个包含不同食品和饮料选择的数据框:

library(dplyr)

data_frame = data.frame(food = c("pizza", "tacos", "nachos"),
 drinks = c("water", "coffee", "pop"))

我创建了一个“列表”,其中包含了这些食物和饮料物品的每一个可能的组合:

lst1 <- lapply(data_frame, function(x) c("none", unlist(lapply(seq_len(length(x)), function(i) combn(x, i, FUN = paste, collapse = " & ")))))

我的问题: 我想把上面的列表变成一个“树状图”,显示所有可能的食物和饮料选择组合,应该类似于这样

enter image description here

是否可以使用 R 中的“data.tree”和“ggplot2”库来实现这一点?

例如,当有 2 个变量和 2 个 "类型" 因素时(第一个变量:1,2;第二个变量:A,B),下面是我正在寻找的(不完整)树的示例:

enter image description here

我找到了这篇以前的 stackoverflow 帖子 (igraph graph.lattice for all combinations (in R)) - 但我不确定如何调整提供的代码来解决我的问题。

有人能请告诉我如何做到这一点吗?

谢谢!


1
lobstr::treeHmisc::tree 怎么样?我认为这些函数与您想要的结果很接近。我不确定您是否得到了所需的组合视图... - Konrad
@ Konrad:谢谢您的回复!我会查看它! - stats_noob
1个回答

2

更新

v <- unlist(df)
l <- lapply(
  seq_along(v),
  function(k) {
    combn(v, k, paste0, collapse = "&")
  }
)
do.call(
  rbind,
  lapply(seq(length(l) - 1), function(k) {
    expand.grid(l[c(k, k + 1)])
  })
) %>%
  graph_from_data_frame() %>%
  plot(layout = layout_with_sugiyama(.)$layout)**

生成的树形图如下所示:

enter image description here

虚拟数据 为了简单起见,我们使用了以下较小的虚拟数据。

df <- data.frame(food = c("a", "b"), drink = 1:2)

之前的回答

你可以使用 expand.gridlst1 进行排列组合。


> expand.grid(lst1)
                     food               drinks
1                    none                 none
2                   pizza                 none
3                   tacos                 none
4                  nachos                 none
5           pizza & tacos                 none
6          pizza & nachos                 none
7          tacos & nachos                 none
8  pizza & tacos & nachos                 none
9                    none                water
10                  pizza                water
11                  tacos                water
12                 nachos                water
13          pizza & tacos                water
14         pizza & nachos                water
15         tacos & nachos                water
16 pizza & tacos & nachos                water
17                   none               coffee
18                  pizza               coffee
19                  tacos               coffee
20                 nachos               coffee
21          pizza & tacos               coffee
22         pizza & nachos               coffee
23         tacos & nachos               coffee
24 pizza & tacos & nachos               coffee
25                   none                  pop
26                  pizza                  pop
27                  tacos                  pop
28                 nachos                  pop
29          pizza & tacos                  pop
30         pizza & nachos                  pop
31         tacos & nachos                  pop
32 pizza & tacos & nachos                  pop
33                   none       water & coffee
34                  pizza       water & coffee
35                  tacos       water & coffee
36                 nachos       water & coffee
37          pizza & tacos       water & coffee
38         pizza & nachos       water & coffee
39         tacos & nachos       water & coffee
40 pizza & tacos & nachos       water & coffee
41                   none          water & pop
42                  pizza          water & pop
43                  tacos          water & pop
44                 nachos          water & pop
45          pizza & tacos          water & pop
46         pizza & nachos          water & pop
47         tacos & nachos          water & pop
48 pizza & tacos & nachos          water & pop
49                   none         coffee & pop
50                  pizza         coffee & pop
51                  tacos         coffee & pop
52                 nachos         coffee & pop
53          pizza & tacos         coffee & pop
54         pizza & nachos         coffee & pop
55         tacos & nachos         coffee & pop
56 pizza & tacos & nachos         coffee & pop
57                   none water & coffee & pop
58                  pizza water & coffee & pop
59                  tacos water & coffee & pop
60                 nachos water & coffee & pop
61          pizza & tacos water & coffee & pop
62         pizza & nachos water & coffee & pop
63         tacos & nachos water & coffee & pop
64 pizza & tacos & nachos water & coffee & pop

1
@stats_noob 没关系!您能否根据您问题中的数据示例手动绘制一张树形图,并在您的帖子中放置一个预期输出的示例呢?我猜测可能有些 igraph 解决方案,但这取决于您想要哪种类型的树形图。 - ThomasIsCoding
@ThomasIsCoding:谢谢您的回复!我认为应该有类似下面这样的东西,可以展示组合是如何分支出来的。 - stats_noob
https://i.stack.imgur.com/dhOFQ.png - stats_noob
1
@stats_noob 好的,我稍后会看一下。 - ThomasIsCoding
2
@stats_noob 不确定你是否对交互式图表感兴趣,但你可能想要检查一下 collapsibleTree 库。 - ismirsehregal
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接