在R中展平列联表

时间:2016-09-22 18:27:59

标签: r

我有一个列联表,例如内置的泰坦尼克号数据集,我想要一种方法来删除变量并将所有值合并在一起。将数据投影到较低维度的空间。

e.g。只看一张桌子的2-D切片

      Sex
Class  Male Female
  1st    57    140
  2nd    14     80
  3rd    75     76
  Crew  192     20

如果我们放弃了Sex变量,我想最终得到一张如下所示的一张列联表:

Class  Freq
  1st   197
  2nd    94
  3rd   151
  Crew  212

我的实际用例是一个N维表,我希望能够构建所有N个1路和N *(N-1)/ 2个2路表。感觉应该有一种简单的方法让它发挥作用。

编辑:请注意,这与链接的问题不重复,因为它指的是数据表,而不是列联表。这里的解决方案是将列联表转换为数据表,然后使用xtabs返回列联表。引用的解决方案仅处理从数据表开始并希望以数据表结束的情况。

1 个答案:

答案 0 :(得分:1)

data(Titanic)
library(dplyr)

as.data.frame(Titanic) %>% group_by(Class) %>% summarise(n=sum(Freq))

# Class     n
# (fctr) (dbl)
# 1    1st   325
# 2    2nd   285
# 3    3rd   706
# 4   Crew   885

或data.table:

library(data.table)
as.data.table(Titanic)[, .(n = sum(N)), keyby=Class]

你可以制作一个暗淡名字的矢量,然后在dplyr或data.table中循环get(dimname)来做单向或双向频率。

示例:

dims <- c('Class','Sex','Age')
dt <- as.data.table(Titanic)
for(dim in dims)
  print(dt[, .(n = sum(N)), keyby = get(dim)])

请注意,get是传递变量名以编程方式执行频率表的一种方法。

要在data.table中执行双向表格,您可以使用dcast

dcast.data.table(dt, Age ~ Class, value.var='N', fun.aggregate=sum)
#      Age 1st 2nd 3rd Crew
# 1: Adult 319 261 627  885
# 2: Child   6  24  79    0

要使用dcast生成多个双向表,您需要以编程方式构建公式,例如: formula = as.formula(paste(v1,v2,sep='~'))

由于data.table语法需要一些习惯,如果你想留在双向表的'tidyverse'中,你可以这样做:

data(Titanic)
library('dplyr')
library('tidyr')

as.data.frame(Titanic) %>% 
  group_by(Age,Class) %>% 
  summarise(n=sum(Freq)) %>%
  spread(Class, n)

#      Age   1st   2nd   3rd  Crew
#   (fctr) (dbl) (dbl) (dbl) (dbl)
# 1  Child     6    24    79     0
# 2  Adult   319   261   627   885