R中的数据框,包含多级行和列

时间:2017-11-09 15:33:47

标签: 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('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中,可以使用数据透视表功能

enter image description here

我认为pandas中的python可以使用df.columns.levels方法。

我还想出了如何只在R中使用dplyr进行多级行(但还没有计算出多级列)

df %>%
    group_by(rowsA, rowsB, colsA) %>%
    summarise(count = n()) %>%
    spread(colsA, count)

# A tibble: 9 x 5
# Groups:   rowsA, rowsB [9]
   rowsA  rowsB     G     H     I
* <fctr> <fctr> <int> <int> <int>
1      A      D     5     3     1
2      A      E     1     2     1
3      A      F     5     8    NA
4      B      D     5     5     5
5      B      E     2     4     6
6      B      F     4     6     5
7      C      D     2     6    NA
8      C      E     6     5     3
9      C      F     4     3     3

1 个答案:

答案 0 :(得分:1)

将转到标题的列粘贴到一列中,然后重新整形,这样就会产生一个与多级计数含义相同的列联表:

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

或者如果您对结果表/数组/矩阵没问题,可以使用xtabs,(从this answer借用),它基本上提供了一个4维数组但是{{1它可以根据需要显示:

ftable