我有一个列联表,例如内置的泰坦尼克号数据集,我想要一种方法来删除变量并将所有值合并在一起。将数据投影到较低维度的空间。
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返回列联表。引用的解决方案仅处理从数据表开始并希望以数据表结束的情况。
答案 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