我有一个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
...
(productX
,stageY
)的值是该阶段产品的完成日期。
我需要一个汇总的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
答案 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), ]