我努力以有意义的方式d_ply
和xyplot
在一个庞大的销售数据库上合并,每周绘制两个面板(一个带有平均价格的图表,一个累计数量)。
我的行动计划是准备数据框,对其进行子集化,并使用xyplot
(每周创建面板)和d_ply
的组合子集(将xyplot应用于所有不同的产品)代码出售)。
假设我有以下类型的数据帧(虚拟代码)和有用的值来对其进行子集化:
library(lattice)
library(latticeExtra)
library(plyr)
set.seed(1)
mydf <- as.data.frame(cbind(COD=rep(c("AB", "CD", "EF", "GH", "IJ"),20), SPEC = rep(c("a","b","c","d","e","f","g","h","i","j"),10)))
mydf$dates <- seq(as.Date("2014-09-01"), by=1, length.out=25)
mydf$x <- as.numeric(rnorm(100))
mydf$z <- as.numeric(rnorm(100))
mydf$deltaxz <- mydf$x-mydf$z
before=as.Date("2014-09-11")
after=as.Date("2014-09-03")
mydf=mydf[mydf$dates<=before & mydf$dates>=after,]
我想要的是为数据帧中的每个COD获取以下trellis对象:
graph1 <- xyplot (deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("black"), layout=c(1,3))
graph2 <- xyplot (1/deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("red"), layout=c(1,3))
我认为应用有用的plyr
函数,我的选择是d_ply
所以我写了以下几行:
graph1 <- function(df) {assign("graph.1", xyplot (deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("black"), layout=c(1,3)), envir=.GlobalEnv)}
graph2 <- function(df) {assign("graph.2", xyplot (1/deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("red"), layout=c(1,3)), envir=.GlobalEnv)}
现在,如果我尝试使用上面与d_ply
结合使用的函数,我就不会得到一个格子对象,而是一个空对象:
graphic1 <- d_ply(mydf, .(mydf$COD), graph1, .print=T)
graphic2 <- d_ply(mydf, .(mydf$COD), graph2, .print=T)
我需要两个格子对象的原因是因为我想将它们一个在另一个下面绘制以显示某些东西(使用实际的销售数字而不是虚拟数据框显而易见)。这将是一个不同的挑战,所以现在我坚持我的要求。
有什么建议吗?
提前谢谢,
MZ
答案 0 :(得分:1)
首先,graph1 / graph2函数中的assign()是什么?这似乎完全没必要。所以只需将它们改为
graph1 <- function(df) {xyplot (deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("black"), layout=c(1,3))}
graph2 <- function(df) {xyplot (1/deltaxz ~ dates | SPEC, data=df, type=c("p","g"), col=c("red"), layout=c(1,3))}
其次,d_ply
专门用于不返回任何内容(NULL)。如果要将结果收集到列表中,请使用
graphic1 <- dlply(mydf, .(mydf$COD), graph1)
graphic2 <- dlply(mydf, .(mydf$COD), graph2)
然后,您可以使用graphic1$AB
等来获取各个图表。