用一个例子可以很好地说明这一点
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)
我认为已经在这个问题上的答案是很棒的选择,但我想根据dplyr软件包分享一个额外的选项(这对我来说是因为我现在正在教一个dplyr用于数据操作的课程,所以我想避免将学生介绍给专业的基础R功能,如tapply或aggregate).
您可以使用该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)
使用两个变量,您可以通过spread在tidyr包中添加对函数的调用来汇总行上的一个变量和列上的另一个变量:
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)