结合 plyr 函数和 lattice 中的 xyplot
Combining plyr functions and xyplot from lattice
我正在努力以有意义的方式 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 获取以下网格对象:
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
首先,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
专门用于 return nothing (NULL)。如果要将结果收集到列表中,请使用
graphic1 <- dlply(mydf, .(mydf$COD), graph1)
graphic2 <- dlply(mydf, .(mydf$COD), graph2)
然后您可以使用 graphic1$AB
等获取各个图表。
我正在努力以有意义的方式 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 获取以下网格对象:
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
首先,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
专门用于 return nothing (NULL)。如果要将结果收集到列表中,请使用
graphic1 <- dlply(mydf, .(mydf$COD), graph1)
graphic2 <- dlply(mydf, .(mydf$COD), graph2)
然后您可以使用 graphic1$AB
等获取各个图表。