1

自从我昨天发布了这个问题的答案以来,这一直困扰着我。

考虑以下数据:

carpaint <- data.frame(paint = c(rep(c("blue", "black", "red"), 
                                     times=3)),
                       car1 = c(100, 138, 123, 143, 112, 
                                144, 343, 112, 334), 
                       car2 = c(111, 238, 323, 541, 328, 
                                363, 411, 238, 313), 
                       car3 = c(432, 123, 322, 342, 323, 
                                522, 334, 311, 452))

如果我想按颜色生成箱线图(忽略“汽车”的二次分组),我可以轻松地使用bwplotfrom中的公式表示法lattice

library(lattice)
bwplot(car1 + car2 + car3 ~ paint, data=carpaint)

点阵输出

boxplot但是,要使用from获得类似的绘图graphics,公式表示法是不同的,因此我必须先将数据转换为长格式然后绘图,如下所示:

carpaint.l = reshape(carpaint, direction="long", varying=2:4, sep="")
boxplot(car ~ paint, data=carpaint.l)

图形输出

问题:有没有办法在不首先重塑数据的情况下使用boxplotfrom获得相同的图graphics,最好使用公式表示法?(这忽略了这样一个事实,即这甚至可能不是链接问题的 OP 想要的输出类型——他们仍然没有评论我的答案或@RomanLuštrik 的问题。我只是想满足我的好奇心并学会更好地理解公式符号。)

注意:绝对欢迎提供替代方案,但我希望任何答案也能帮助我理解为什么某些选项有效而其他选项无效。例如,为什么boxplot(as.matrix(carpaint[, 2:4]) ~ carpaint$paint)有效但boxplot(carpaint[, 2:4] ~ carpaint$paint)无效。我觉得这很奇怪,因为文档中boxplot有一些示例,它们在绘图之前将矩阵转换为数据帧,即使这似乎没有必要。

4

1 回答 1

2

carpaint[, 2:4]是一个列表,而两者cbind(car1, car2, car3)都有as.matrix(carpaint[, 2:4])一个基础的原子向量表示。boxplot 的帮助页面说 'y' 参数需要是一个数字向量。boxplot.formula用途splitboxplot(split(mf[[response]], mf[-response]), ...)grp参数被回收split以匹配响应向量的长度。split无法使用 list/data.frame 形式的三个向量来做到这一点。

于 2012-07-17T13:50:20.603 回答