在ddply中包含零行的日期

时间:2013-02-24 00:19:33

标签: r

我正在使用plyr包中的ddply来获取按日期计算的行数。但是,当有没有值的日期时,它们会被忽略,我最终会得到一个数据框,其中某些日期不存在。我正在使用ddply生成的值来生成一个图,并希望找到如何包含所有不存在的日期,并给它们一个nrow值为0。

library(plyr)
f = ddply(df, .(created), "nrow")
f = as.data.frame(f)

> head(f)
     created nrow
1 2009-12-29    2
2 2009-12-30    3
3 2010-01-06    1
4 2010-01-07    2
5 2010-01-08    2
6 2010-01-11    1

为了正确构建线图,我想拥有所有日期(那些具有0 nrow值的日期)。因此,在上面的细分中,我想将所有缺失的日期(例如“2010-01-01”)添加到“2010-01-05”,并将每个值的每个值设置为9.不能有人建议以优雅的方式执行此操作任务。

ggplot(f, aes(x=created, y=nrow)) + 
  geom_line(size=0.6, color="darkgreen") +
  labs(title="Plot") +
  theme(axis.text.y=element_text(family="sans", face="bold"),  
        axis.text.x=element_text(family="sans", face="bold"))  

我认为ddply中的.drop命令执行了这项任务,但它似乎没有这样做。

编辑:

示例数据。

mdf=data.frame(created=c('2009-12-29','2009-12-30','2010-01-06','2010-01-07',
                     '2010-01-08','2010-01-11','2009-12-29','2009-12-30'))

ddply(mdf, .(created), .drop=FALSE, "nrow")



    created nrow
1 2009-12-29    2
2 2009-12-30    2
3 2010-01-06    1
4 2010-01-07    1
5 2010-01-08    1
6 2010-01-11    1

我怎样才能将'2010-01-01','2010-01-02'等包含在0为nrow的值中。

3 个答案:

答案 0 :(得分:4)

使用适当类的对象

由于您需要绘图,因此将日期作为“日期”类提供就足够了。

# Load libraries
library(package=plyr)
library(package=ggplot2)

# Create data
mdf <- data.frame(created=c('2009-12-29','2009-12-30','2010-01-06','2010-01-07',
                     '2010-01-08','2010-01-11','2009-12-29','2009-12-30'))
mdf$created <- as.Date(mdf$created)

# Plot with variable of class "Date"
ggplot(mdf, aes(x=created)) + 
  geom_line(size=0.6, color="darkgreen", stat='bin', binwidth=1) +
  labs(title="Plot") +
  theme(axis.text.y=element_text(family="sans", face="bold"),  
        axis.text.x=element_text(family="sans", face="bold"))

enter image description here

答案 1 :(得分:3)

直接的方法是使用data.frame的结果的minmax创建包含所有日期的其他ddply

# dummy data.frame
set.seed(45)
dates <- seq(as.Date("2013-01-01"), as.Date("2013-03-31"), by=3)
df <- data.frame(created=sample(dates, 100, replace=T))
# your plyr result
require(plyr)
df.r <- ddply(df, .(created), nrow) # 30 * 2

# solution:
df2 <- data.frame(created = seq(min(df.r$created), max(df.r$created), by=1), V1 = 0)
idx <- match(df2$created, df.r$created)
df2$V1[!is.na(idx)] <- df.r$V1[idx[!is.na(idx)]]

现在,对于df2中缺失的日期,0's将包含df.r的所有日期。我不确定这是否“优雅”!

答案 2 :(得分:3)

您可以准备包含所有日期(序列)的列表,然后与您的表日期合并。这将在原始数据中插入NA。

dd <- ddply(mdf,.(created),nrow)
df.miss <- data.frame(created=seq.Date(min(dd$created),max(dd$created),1))
dat <- merge(dd,df.miss,all.y=T)
dat[is.na(dat)] <- 0  ## I replace NA by 0 here

现在我绘制数据

library(lattice)
xyplot(V1~created,data=dat, type=c('l','p'),cex=2,lty=2)

enter image description here