如何在R中分离因子交互作用

3
最近我需要基于因素的相互作用绘制一些数据图表,但我发现在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)

现在我想使用格子图 xyplot 来绘制这些均值,其中每个值为 a 的面板。 均值是 y 值,b 因素是 x 值。 标准的 xyplot 公式类似于:
xyplot( y ~ b | a, data=mydf)

其中mydf是一个数据框,包含从上面的tapply计算得出的列yba。但我的问题是如何分离交互因素。这是我所做的。
factorSplit <- strsplit(names(y), ":")
a1 <- sapply(factorSplit, function(x) {x[1]})
b1 <- sapply(factorSplit, function(x) {x[2]})
mydf <- data.frame(y, b1, a1)

现在,mydf 已经有了。
> mydf
           y b1 a1
1:1 3.856797  1  1
1:2 3.487181  2  1
1:3 8.411425  3  1
1:4 3.757709  4  1
1:5 4.982970  5  1
1:6 6.480346  6  1
2:1 2.778864  1  2
2:2 4.390511  2  2
2:3 7.119926  3  2
2:4 4.707945  4  2
2:5 5.546894  5  2
2:6 8.984631  6  2

我可以使用图表。
xyplot(y ~ b1 | a1, mydf, layout=c(1,2))

但我觉得使用 strsplitnames(y) 进行分割,然后再使用 sapply,有些过度了。似乎应该有一种更直接的方法来恢复使用 tapply 创建的因子交互作用。

4
由于您希望保留ab列,因此在这里使用aggregate比使用tapply更好:y <- aggregate(n~a+b, NULL, mean) - MrFlick
aggregate很不错。但是当基础分组变得太复杂时,我通常会转向dplyr,它使得这个过程非常简单。在这种情况下,data_frame(n, a, b) %>% group_by(a, b) %>% summarise(y = mean(n)) - alistaire
不要在问题中更新解决方案,而应该将其作为下面的答案发布(回答自己的问题也可以),因为这样问题就不再显示为未回答。 - MrFlick
1个回答

0

聚合函数正是我之前理解不足的地方。正如评论中指出的那样,一次调用聚合函数就可以完成我之前费力苦思的所有工作。

> 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
>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接