【问题标题】:Combining plyr functions and xyplot from lattice从 lattice 结合 plyr 函数和 xyplot
【发布时间】:2015-01-29 18:26:28
【问题描述】:

我正在努力以一种有意义的方式将 d_plyxyplot 组合到一个大型销售数据库中,每周绘制两个面板(一个带有平均价格图表,一个带有累积数量图表)。

我的行动计划是准备数据框,对其进行子集化,并将子集与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

【问题讨论】:

    标签: r plyr lattice panels


    【解决方案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 等获取各个图表。

    【讨论】:

    • 感谢弗利克先生!现在我发现这很容易,但我很固执,以至于我不想改变我以前的编码(或者更好的是,我不确定要修改什么)。我现在将尝试以合理的方式将它们绘制在一起,可能使用l_ply 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2013-07-30
    • 2016-08-02
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多