最近我需要基于因素的相互作用绘制一些数据图表,但我发现在R中这比我想象中的更加困难。我怀疑自己漏掉了什么。假设我有一个包含30个数字和一对因素的向量。
我想要每个因素组合的均值。
现在我想使用格子图 xyplot 来绘制这些均值,其中每个值为
其中
现在,
我可以使用图表。
但我觉得使用 strsplit 对
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计算得出的列y
、b
和a
。但我的问题是如何分离交互因素。这是我所做的。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))
但我觉得使用 strsplit 对
names(y)
进行分割,然后再使用 sapply,有些过度了。似乎应该有一种更直接的方法来恢复使用 tapply 创建的因子交互作用。
a
和b
列,因此在这里使用aggregate
比使用tapply
更好:y <- aggregate(n~a+b, NULL, mean)
。 - MrFlickaggregate
很不错。但是当基础分组变得太复杂时,我通常会转向dplyr
,它使得这个过程非常简单。在这种情况下,data_frame(n, a, b) %>% group_by(a, b) %>% summarise(y = mean(n))
。 - alistaire