选择组合,顺序和树

ran*_*ell 5 r ggplot2

我有以下数据表示人在四个值(f1,f2,c1,c2)之间选择的顺序:

df=structure(list(combi = structure(c(24L, 8L, 3L, 19L, 4L, 23L, 
15L, 12L, 14L, 22L, 5L, 13L, 18L, 9L, 2L, 25L, 11L, 7L, 21L, 
10L, 6L, 17L, 20L, 16L), .Label = c("", "c1-c2-f1-f2", "c1-c2-f2-f1", 
"c1-f1-c2-f2", "c1-f1-f2-c2", "c1-f2-c2-f1", "c1-f2-f1-c2", "c2-c1-f1-f2", 
"c2-c1-f2-f1", "c2-f1-c1-f2", "c2-f1-f2-c1", "c2-f2-c1-f1", "c2-f2-f1-c1", 
"f1-c1-c2-f2", "f1-c1-f2-c2", "f1-c2-c1-f2", "f1-c2-f2-c1", "f1-f2-c1-c2", 
"f1-f2-c2-c1", "f2-c1-c2-f1", "f2-c1-f1-c2", "f2-c2-c1-f1", "f2-c2-f1-c1", 
"f2-f1-c1-c2", "f2-f1-c2-c1"), class = "factor"), nb = c(10L, 
0L, 2L, 4L, 1L, 5L, 1L, 2L, 1L, 3L, 1L, 0L, 3L, 5L, 0L, 18L, 
5L, 2L, 5L, 0L, 4L, 4L, 11L, 2L)), .Names = c("combi", "nb"), class = "data.frame", row.names = c(1L, 
3L, 5L, 7L, 9L, 11L, 13L, 15L, 17L, 19L, 21L, 23L, 25L, 27L, 
29L, 31L, 33L, 35L, 37L, 39L, 41L, 43L, 45L, 47L))
Run Code Online (Sandbox Code Playgroud)

我想知道是否存在可以量化的树表示(或其他),对于每个步骤选择号,通过考虑共同的子链.示例:

f2  (52) -f1 (28)  -c1-c2  (10)
                   -c2-c1  (18) 
Run Code Online (Sandbox Code Playgroud)

f2(52)有52次链由f2开始.从f2-f1开始有28次链.

非常感谢.

42-*_*42- 4

如果您读取combi(使用as.character)中的值,您可以将这些值扩展到字符列:

df2 <-  cbind(df, read.table(text=as.character(df$combi), sep="-",stringsAsFactors=FALSE)  )
Run Code Online (Sandbox Code Playgroud)

然后您可以按照您想要的任何级别进行制表:

 xtabs(nb~V1, data=df2) # First level only
#V1
#c1 c2 f1 f2 
#10 12 15 52 

xtabs(nb~paste(V1,V2,sep="-"), data=df2) # first and second
#--
# paste(V1, V2, sep = "-")
#c1-c2 c1-f1 c1-f2 c2-c1 c2-f1 c2-f2 f1-c1 f1-c2 f1-f2 f2-c1 f2-c2 f2-f1 
#    2     2     6     5     5     2     2     6     7    16     8    28 
Run Code Online (Sandbox Code Playgroud)

您还可以部署该addmargins函数来紧凑地显示两个“最高级”职位小计:

 addmargins( xtabs(nb~V1+V2, data=df2))
 #=========
     V2
V1    c1 c2 f1 f2 Sum
  c1   0  2  2  6  10
  c2   5  0  5  2  12
  f1   2  6  0  7  15
  f2  16  8 28  0  52
  Sum 23 16 35 15  89
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式“展平” ftable

 ftable( addmargins( xtabs(nb~V1+V2, data=df2)), row.vars=1:2)
V1  V2     
c1  c1    0
    c2    2
    f1    2
    f2    6
    Sum  10
c2  c1    5
    c2    0
    f1    5
    f2    2
    Sum  12
f1  c1    2
    c2    6
    f1    0
    f2    7
    Sum  15
f2  c1   16
    c2    8
    f1   28
    f2    0
    Sum  52
Sum c1   23
    c2   16
    f1   35
    f2   15
    Sum  89
Run Code Online (Sandbox Code Playgroud)

最终的统计结果是:

xtabs(nb~paste(V1,V2,V3,V4,sep="-"), data=df2)
#-----
paste(V1, V2, V3, V4, sep = "-")
c1-c2-f1-f2 c1-c2-f2-f1 c1-f1-c2-f2 c1-f1-f2-c2 c1-f2-c2-f1 c1-f2-f1-c2 c2-c1-f1-f2 c2-c1-f2-f1 
          0           2           1           1           4           2           0           5 
c2-f1-c1-f2 c2-f1-f2-c1 c2-f2-c1-f1 c2-f2-f1-c1 f1-c1-c2-f2 f1-c1-f2-c2 f1-c2-c1-f2 f1-c2-f2-c1 
          0           5           2           0           1           1           2           4 
f1-f2-c1-c2 f1-f2-c2-c1 f2-c1-c2-f1 f2-c1-f1-c2 f2-c2-c1-f1 f2-c2-f1-c1 f2-f1-c1-c2 f2-f1-c2-c1 
          3           4          11           5           3           5          10          18 
Run Code Online (Sandbox Code Playgroud)

要在列中查看全部内容:

as.matrix( xtabs(nb~paste(V1,V2,V3,V4,sep="-"), data=df2) )
#----------------
            [,1]
c1-c2-f1-f2    0
c1-c2-f2-f1    2
c1-f1-c2-f2    1
c1-f1-f2-c2    1
c1-f2-c2-f1    4
c1-f2-f1-c2    2
c2-c1-f1-f2    0
c2-c1-f2-f1    5
c2-f1-c1-f2    0
c2-f1-f2-c1    5
c2-f2-c1-f1    2
c2-f2-f1-c1    0
f1-c1-c2-f2    1
f1-c1-f2-c2    1
f1-c2-c1-f2    2
f1-c2-f2-c1    4
f1-f2-c1-c2    3
f1-f2-c2-c1    4
f2-c1-c2-f1   11
f2-c1-f1-c2    5
f2-c2-c1-f1    3
f2-c2-f1-c1    5
f2-f1-c1-c2   10
f2-f1-c2-c1   18
Run Code Online (Sandbox Code Playgroud)

我想“包含所有小计的最终答案可能是:

 ftable( addmargins( xtabs(nb~V1+V2+paste(V3,V4,sep="-"), data=df2)), row.vars=1:3)
Run Code Online (Sandbox Code Playgroud)

然而,其中有太多零条目,我犹豫是否推荐。您可以删除零行:

my.ftable <- ftable( addmargins( xtabs(nb~V1+V2+paste(V3,V4,sep="-"), data=df2)), row.vars=1:3)
my.df.table <- as.data.frame(my.ftable)
names(my.df.table)[3] <- "3rd_4th"
my.df.table[ my.df.table$Freq > 0,  ]
#---------
     V1  V2 3rd_4th Freq
14   f2  f1   c1-c2   10
15  Sum  f1   c1-c2   10
18   f1  f2   c1-c2    3
20  Sum  f2   c1-c2    3
23   f1 Sum   c1-c2    3
24   f2 Sum   c1-c2   10
25  Sum Sum   c1-c2   13
34   f2  c2   c1-f1    3
35  Sum  c2   c1-f1    3
42   c2  f2   c1-f1    2
45  Sum  f2   c1-f1    2
47   c2 Sum   c1-f1    2
49   f2 Sum   c1-f1    3
50  Sum Sum   c1-f1    5
# and many more rows
#...  until
321  c1 Sum     Sum   10
322  c2 Sum     Sum   12
323  f1 Sum     Sum   15
324  f2 Sum     Sum   52
325 Sum Sum     Sum   89
Run Code Online (Sandbox Code Playgroud)