R中具有多级行和列的数据帧

R中具有多级行和列的数据帧,r,dplyr,R,Dplyr,假设我有以下数据帧 > df = data.frame(rowsA = sample(c('A','B','C'), 100, replace=TRUE), rowsB = sample(c('D','E','F'), 100, replace=TRUE), colsA = sample(c('G','H','I'), 100, replace=TRUE), colsB = sample(c('

假设我有以下数据帧

> df = data.frame(rowsA = sample(c('A','B','C'), 100, replace=TRUE),
                rowsB = sample(c('D','E','F'), 100, replace=TRUE),
                colsA = sample(c('G','H','I'), 100, replace=TRUE),
                colsB = sample(c('J','K','L'), 100, replace=TRUE))

> head(df)
  rowsA rowsB colsA colsB
1     B     E     I     L
2     A     E     G     J
3     A     E     H     K
4     A     D     I     J
5     C     F     G     J
6     A     F     G     J
是否可以创建多级计数表

在excel中,可以使用数据透视表功能

我认为在python中使用df.columns.levels方法是可能的

我还了解了如何使用dplyr只在R中执行多级行(但还没有了解多级列)

df%>%
分组依据(rowsA、rowsB、colsA)%>%
汇总(计数=n())%>%
扩散(colsA,计数)
#一个tibble:9x5
#组别:rowsA,rowsB[9]
rowsA rowsB G H I
*     
1 A D 5 3 1
2 A E 1 2 1
3 A F 5 8 NA
4 B D 5 5
5 B E 2 4 6
6bf65
7 C D 2 6 NA
8 C E 6 5 3
9CF433

将标题中的列粘贴到一列中,然后对其进行重塑,这样您就有了一个与多级计数含义相同的列联表:

library(dplyr); library(tidyr)
df %>% 
    unite(header, c('colsA', 'colsB')) %>% 
    count(rowsA, rowsB, header) %>% 
    spread(header, n, fill = 0)

# A tibble: 9 x 11
#   rowsA  rowsB   G_J   G_K   G_L   H_J   H_K   H_L   I_J   I_K   I_L
#* <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1      A      D     1     0     0     0     3     1     1     1     0
#2      A      E     2     0     0     1     1     0     0     0     1
#3      A      F     5     0     0     3     2     1     0     1     1
#4      B      D     0     1     1     1     0     3     1     1     1
#5      B      E     2     2     1     3     1     1     0     3     1
#6      B      F     1     1     2     3     3     0     1     2     1
#7      C      D     0     2     3     1     2     0     4     3     2
#8      C      E     2     2     2     1     2     0     0     1     1
#9      C      F     1     0     1     2     0     1     2     1     2

我也认为这在SAS和STATA也是可能的。有点奇怪,这还没有在R包中实现。可能这是一个。
library(dplyr); library(tidyr)
df %>% 
    unite(header, c('colsA', 'colsB')) %>% 
    count(rowsA, rowsB, header) %>% 
    spread(header, n, fill = 0)

# A tibble: 9 x 11
#   rowsA  rowsB   G_J   G_K   G_L   H_J   H_K   H_L   I_J   I_K   I_L
#* <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1      A      D     1     0     0     0     3     1     1     1     0
#2      A      E     2     0     0     1     1     0     0     0     1
#3      A      F     5     0     0     3     2     1     0     1     1
#4      B      D     0     1     1     1     0     3     1     1     1
#5      B      E     2     2     1     3     1     1     0     3     1
#6      B      F     1     1     2     3     3     0     1     2     1
#7      C      D     0     2     3     1     2     0     4     3     2
#8      C      E     2     2     2     1     2     0     0     1     1
#9      C      F     1     0     1     2     0     1     2     1     2
ftable(xtabs(data = df), row.vars = 1:2, col.vars = 3:4)

#            colsA G     H     I    
#            colsB J K L J K L J K L
#rowsA rowsB                        
#A     D           1 0 0 0 3 1 1 1 0
#      E           2 0 0 1 1 0 0 0 1
#      F           5 0 0 3 2 1 0 1 1
#B     D           0 1 1 1 0 3 1 1 1
#      E           2 2 1 3 1 1 0 3 1
#      F           1 1 2 3 3 0 1 2 1
#C     D           0 2 3 1 2 0 4 3 2
#      E           2 2 2 1 2 0 0 1 1
#      F           1 0 1 2 0 1 2 1 2