我有一个应急表(如泰坦尼克号数据集中内置的),我希望有一种方法来删除一个变量并将所有的值合并在一起。某种程度上,将数据投影到低维空间。
只看一张二维的桌子
Sex
Class Male Female
1st 57 140
2nd 14 80
3rd 75 76
Crew 192 20
如果我们要删除“性”变量,我希望最终得到一个一维应急表,如下所示:
Class Freq
1st 197
2nd 94
3rd 151
Crew 212
我的实际用例是一个N维表,我希望能够从它构造所有N1和N*(N-1)/2双向表。我觉得应该有个简单的方法让这件事起作用。
编辑:请注意,这不是与此链接的问题的重复,因为它指的是数据表,而不是应急表。这里的解决方案是将应急表转换为数据表,然后使用xtabs返回一个应急表。引用的解决方案只处理从数据表开始并希望以数据表结束的情况。
发布于 2016-09-22 18:50:43
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或get(dimname)
或data.table中循环执行单向或双向频率。
示例:
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
https://stackoverflow.com/questions/39646366
复制相似问题