如何分离R中的因素相互作用

如何分离R中的因素相互作用,r,tapply,split-apply-combine,R,Tapply,Split Apply Combine,我最近不得不根据各种因素的相互作用来绘制一些数据,我发现这比我认为在R中应该是如此普遍的东西要困难得多。我怀疑我遗漏了一些东西。假设我有一个由30个数字和一对因子组成的向量 n <- runif(30, min=0, max=10) a <- gl(2, 1, 30) b <- gl(6, 2, 30) y <- tapply(n, a:b, mean) 其中,mydf是一个数据框,其列y、b和a是根据上面的taply计算得出的。但我的问题是如何理清相互作用的因素。这

我最近不得不根据各种因素的相互作用来绘制一些数据,我发现这比我认为在R中应该是如此普遍的东西要困难得多。我怀疑我遗漏了一些东西。假设我有一个由30个数字和一对因子组成的向量

n <- runif(30, min=0, max=10)
a <- gl(2, 1, 30)
b <- gl(6, 2, 30)
y <- tapply(n, a:b, mean)
其中,
mydf
是一个数据框,其列
y
b
a
是根据上面的taply计算得出的。但我的问题是如何理清相互作用的因素。这就是我所做的

factorSplit <- strsplit(names(y), ":")
a1 <- sapply(factorSplit, function(x) {x[1]})
b1 <- sapply(factorSplit, function(x) {x[2]})
mydf <- data.frame(y, b1, a1)
我可以和你一起策划

xyplot(y ~ b1 | a1, mydf, layout=c(1,2))

但我觉得这项业务与strsplit
names(y)
,然后sapply有点过分了。似乎应该有一种更直接的方法来恢复由tapply

创建的因子交互作用聚合功能正是我所缺乏的。正如评论中所指出的,一次对聚合的调用就完成了我之前所做的一切

> x <- aggregate(n ~ a+b, NULL, mean)
> head(x)
  a b        n
1 1 1 2.967073
2 2 1 3.001279
3 1 2 3.867564
4 2 2 1.076378
5 1 3 2.805827
6 2 3 6.275858
> dim(x)
[1] 12  3
>
>x头(x)
a b n
1 1 1 2.967073
2 2 1 3.001279
3 1 2 3.867564
4 2 2 1.076378
5 1 3 2.805827
6 2 3 6.275858
>尺寸(x)
[1] 12  3
>

由于您希望保留
a
b
列,因此最好在此处使用
aggregate
而不是
tapply
y
aggregate
非常好。但是,当基本分组变得太混乱时,我通常会转向
dplyr
,这使得它非常简单。在这种情况下,
data\u frame(n,a,b)%%>%group\u by(a,b)%%>%summary(y=mean(n))
您不应该用解决方案更新问题,而应该将其发布为下面的答案(可以回答您自己的问题),因为这样问题就不再显示为未回答。
xyplot(y ~ b1 | a1, mydf, layout=c(1,2))
> x <- aggregate(n ~ a+b, NULL, mean)
> head(x)
  a b        n
1 1 1 2.967073
2 2 1 3.001279
3 1 2 3.867564
4 2 2 1.076378
5 1 3 2.805827
6 2 3 6.275858
> dim(x)
[1] 12  3
>