带有日期字段的data.frame上的ddply

时间:2014-05-30 15:32:46

标签: r plyr

我有一个data.frame,它由产品和每个项目的不同开发阶段组成。列是阶段,行是产品。它看起来像这样:

PRODUCT_NUM || STAGE_1   || STAGE_2   || STAGE_X  
PRODUCT_1   || 01-MAR-11 || 01-MAR-11 || 05-MAR-11  
PRODUCT_2   || 01-JUN-13 || 03-JUN-11 || 03-JUL-11  
...

productXstageY)的值是该阶段产品的完成日期。

我需要一个汇总的data.frame,其行数为月/年,列为count(stageY)

看起来像这样:

MONTH/YEAR || COUNT(STAGE_1) || COUNT(STAGE_2) || COUNT(STAGE_X)  
MAR-11     || 1              || 2              || 7  
JUL-13     || 1              || 0              || 5  
JUN-13     || 3              || 1              || 0 

我实际上使用ddply获得了解决方案,但我的代码类似如下:

stage1=ddply(subset(dat, !is.na(dat$stage1date)),"STAGE_1_DATE", summarize,
MONTH=max(format(STAGE_1_DATE, "%m")),
YEAR=max(format(STAGE_1_DATE, "%Y")),
COUNT=length(STAGE_1_DATE)
)

stage1=ddply(posted, c("YEAR","MONTH"), summarize, STAGE1=sum(COUNT))

stage2=ddply(subset(dat, !is.na(dat$stage2date)),"STAGE_2_DATE", summarize,
MONTH=max(format(STAGE_2_DATE, "%m")),
YEAR=max(format(STAGE_2_DATE, "%Y")),
COUNT=length(STAGE_2_DATE)
)

stage2=ddply(posted, c("YEAR","MONTH"), summarize, STAGE2=sum(COUNT))

stageX=ddply(subset(dat, !is.na(dat$stagexdate)),"STAGE_X_DATE", summarize,
MONTH=max(format(STAGE_X_DATE, "%m")),
YEAR=max(format(STAGE_X_DATE, "%Y")),
COUNT=length(STAGE_X_DATE)
)

stageX=ddply(posted, c("YEAR","MONTH"), summarize, STAGEX=sum(COUNT))

total=merge(stage1, merge( stage2, stageX, by(c("YEAR","MONTH"))), 
            by=c("YEAR","MONTH"))

首先,我汇总每个阶段的天数,然后汇总每个阶段的几个月,然后最后我将所有阶段合并为一个data.frame。

我希望一次性完成这项工作。

更好的是有一个函数,如函数(df,col,func = length),它会吐出月/年和一个阶段的聚合数,然后我可以调用这个函数,具体取决于阶段的数量我想看看。

我已经查看了以下帖子,但未能为我的案例实施。

R: ddply function applied to certain months obtained from date field

1 个答案:

答案 0 :(得分:1)

您的数据集有点短,但我认为可以按照以下方式解决:

library(data.table)
library(reshape2)
library(zoo)
library(lubridate)

df = as.data.table(as.matrix(df))

df = melt(df, id.vars = "PRODUCT_NUM")
df$value=ymd(df$value)
df[, value := as.yearmon(value, format = "%d-%b-%Y")]

df2 = df[ , .N, by = list(variable, value)]
df2 = dcast.data.table(df2, value ~ variable, value.var = "N", sum)
df2[is.na(df2)] = 0
df2[order(value), ]