我最近不得不根据因素的相互作用来绘制一些数据,我发现它比我觉得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
是一个数据框,其中y
,b
和a
列是从 tapply 计算出来的。但我的问题是如何解开相互作用的因素。这就是我所做的。
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))
但是我认为names(y)
的 strsplit 然后 sapply 这项业务有点矫枉过正。似乎应该有一种更直接的方法来恢复使用 tapply 创建的因子交互。
答案 0 :(得分: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
>