让我们看一下这段代码:
library(doBy)
tab <- summaryBy(x ~ A + B, df)
x
它计算A 和 B 的每个组合的平均值。
如何在行和列中创建一个二维表,tab
以便行和列的交集给出具有给定 A 和 B 组合的组的平均值?A
B
x
让我们看一下这段代码:
library(doBy)
tab <- summaryBy(x ~ A + B, df)
x
它计算A 和 B 的每个组合的平均值。
如何在行和列中创建一个二维表,tab
以便行和列的交集给出具有给定 A 和 B 组合的组的平均值?A
B
x
我会跳过中间步骤并使用旨在提供您想要的功能的功能,即tapply
. 使用 agsudy 的数据:
> x.mean <- with(dat, tapply(x, list(A=A,B=B), mean))
> x.mean
B
A 2 3 4 5
1 0.3671088 0.4531040 0.5942483 0.8013453
2 0.4776386 0.6115361 0.7907584 0.6607741
3 0.3966482 0.3447879 0.4372367 0.4914243
4 0.2779789 0.6780573 0.4087858 0.4205421
5 0.6288597 0.6924584 0.6508705 0.5648296
如果您真的想使用中间步骤,您也可以使用tapply
orI
函数c
进行重新排列:
with(tab, tapply(x.mean, list(A=A,B=B), c))
B
A 2 3 4 5
1 0.3671088 0.4531040 0.5942483 0.8013453
2 0.4776386 0.6115361 0.7907584 0.6607741
3 0.3966482 0.3447879 0.4372367 0.4914243
4 0.2779789 0.6780573 0.4087858 0.4205421
5 0.6288597 0.6924584 0.6508705 0.5648296
> with(tab, tapply(x.mean, list(A,B), I))
2 3 4 5
1 0.3671088 0.4531040 0.5942483 0.8013453
2 0.4776386 0.6115361 0.7907584 0.6607741
3 0.3966482 0.3447879 0.4372367 0.4914243
4 0.2779789 0.6780573 0.4087858 0.4205421
5 0.6288597 0.6924584 0.6508705 0.5648296
如果我理解,我认为您正在寻求重塑您的数据。一种选择是dcast
从reshape2
包中使用:
dat.s <- summaryBy(x~B+A, data=dat)
library(reshape2)
dcast(dat.s,A~B)
例如:
## create some data
set.seed(1)
dat <- data.frame(x=runif(100),
A=sample(1:5,100,rep=TRUE),
B=sample(2:5,100,rep=TRUE))
library(doBy)
dat.s <- summaryBy(x~B+A, data=dat)
dat.s <- round(dat.s,2) ## for better output
library(reshape2)
dcast(dat.s,A~B)
A 2 3 4 5
1 1 0.37 0.45 0.59 0.80
2 2 0.48 0.61 0.79 0.66
3 3 0.40 0.34 0.44 0.49
4 4 0.28 0.68 0.41 0.42
5 5 0.63 0.69 0.65 0.56