两个或多个因子变量的汇总统计数据?

nzc*_*ops 13 r summary

用一个例子可以很好地说明这一点

str(mtcars)
mtcars$gear <- factor(mtcars$gear, labels=c("three","four","five"))
mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
mtcars$am <- factor(mtcars$am, labels=c("manual","auto")
str(mtcars)
tapply(mtcars$mpg, mtcars$gear, sum)
Run Code Online (Sandbox Code Playgroud)

这给了我每个齿轮的加总mpg.但是我说我想要一个3x3的桌子,顶部有齿轮,侧面是圆形,而且有两个总和的9个单元格,我怎么能"聪明地"得到它.

我可以去.

tapply(mtcars$mpg[mtcars$cyl=="four"], mtcars$gear[mtcars$cyl=="four"], sum)
tapply(mtcars$mpg[mtcars$cyl=="six"], mtcars$gear[mtcars$cyl=="six"], sum)
tapply(mtcars$mpg[mtcars$cyl=="eight"], mtcars$gear[mtcars$cyl=="eight"], sum)
Run Code Online (Sandbox Code Playgroud)

这看起来很麻烦.

那么我如何在混合中加入第三个变量呢?

这有点在我正在思考的空间中. 使用ddply进行汇总统计

更新这让我在那里,但它并不漂亮.

aggregate(mpg ~ am+cyl+gear, mtcars,sum)
Run Code Online (Sandbox Code Playgroud)

干杯

Jos*_*ien 35

怎么样,还在使用tapply()?它比你知道的更多才多艺!

with(mtcars, tapply(mpg, list(cyl, gear), sum))
#       three  four five
# four   21.5 215.4 56.4
# six    39.5  79.0 19.7
# eight 180.6    NA 30.8
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望打印输出更具解释性:

with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), sum))
Run Code Online (Sandbox Code Playgroud)

如果你想使用两个以上的交叉分类变量,这个想法完全一样.然后,结果将以3维或更多维数组返回:

A <- with(mtcars, tapply(mpg, list(cyl, gear, carb), sum))

dim(A)
# [1] 3 3 6
lapply(1:6, function(i) A[,,i]) # To convert results to a list of matrices

# But eventually, the curse of dimensionality will begin to kick in...
table(is.na(A))
# FALSE  TRUE 
#    12    42 
Run Code Online (Sandbox Code Playgroud)


jos*_*ber 8

我认为已经在这个问题上的答案是很棒的选择,但我想根据dplyr软件包分享一个额外的选项(这对我来说是因为我现在正在教一个dplyr用于数据操作的课程,所以我想避免将学生介绍给专业的基础R功能,如tapplyaggregate).

您可以使用该group_by函数对所需的变量进行分组,然后使用这些组汇总信息summarize.我认为这个代码比基于公式的界面对R新手更具可读性aggregate,产生相同的结果:

library(dplyr)
mtcars %>%
  group_by(am, cyl, gear) %>%
  summarize(mpg=sum(mpg))
#       am   cyl  gear   mpg
#    (dbl) (dbl) (dbl) (dbl)
# 1      0     4     3  21.5
# 2      0     4     4  47.2
# 3      0     6     3  39.5
# 4      0     6     4  37.0
# 5      0     8     3 180.6
# 6      1     4     4 168.2
# 7      1     4     5  56.4
# 8      1     6     4  42.0
# 9      1     6     5  19.7
# 10     1     8     5  30.8
Run Code Online (Sandbox Code Playgroud)

使用两个变量,您可以通过spreadtidyr包中添加对函数的调用来汇总行上的一个变量和列上的另一个变量:

library(dplyr)
library(tidyr)
mtcars %>%
  group_by(cyl, gear) %>%
  summarize(mpg=sum(mpg)) %>%
  spread(gear, mpg)
#     cyl     3     4     5
#   (dbl) (dbl) (dbl) (dbl)
# 1     4  21.5 215.4  56.4
# 2     6  39.5  79.0  19.7
# 3     8 180.6    NA  30.8
Run Code Online (Sandbox Code Playgroud)