我正在使用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的值中。
答案 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"))
答案 1 :(得分:3)
直接的方法是使用data.frame
的结果的min
和max
创建包含所有日期的其他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)