我有一个数据集,包括按年和月的情况。缺少几个月,我想在这几个月创建一个案例数为零的行。
这是一个例子,我目前的蛮力方法。谢谢你的任何指示。显然,我是新人。
# fake data
library(plyr)
rm(FakeData)
FakeData <- data.frame(DischargeYear=c(rep(2010, 7), rep(2011,7)),
DischargeMonth=c(1:7, 3:9),
Cases=trunc(rnorm(14, mean=100, sd=20)))
# FakeData is missing data for some year/months
FakeData
# Brute force attempt to add rows with 0 and then total
for(i in 1:12){
for(j in 1:length(unique(FakeData$DischargeYear))){
FakeData <- rbind(FakeData, data.frame(
DischargeYear=unique(FakeData$DischargeYear)[j],
DischargeMonth=i,
Cases=0))
}
}
FakeData <- ddply(FakeData, c("DischargeYear","DischargeMonth"), summarise, Cases=sum(Cases))
# FakeData now has every year/month represented
FakeData
答案 0 :(得分:5)
使用FakeData
数据框,试试这个:
# Create all combinations of months and years
allMonths <- expand.grid(DischargeMonth=1:12, DischargeYear=2010:2011)
# Keep all month-year combinations (all.x=TRUE) and add in 'Cases' from FakeData
allData <- merge(allMonths, FakeData, all.x=TRUE)
# 'allData' contains 'NA' for missing values. Set them to 0.
allData[is.na(allData)] <- 0
# Print results
allData
答案 1 :(得分:2)
另一种解决方案是使用cast
包中的reshape
。
require(reshape)
cast(Fakedata, DischargeYear + DischargeMonth ~ ., add.missing = TRUE, fill = 0)
请注意,它仅为数据中的缺失组合添加0,对于2010年的月8,9,以及2011年的1和2个月。为了确保您拥有所有月份1:12,您可以更改DischargeMonth是使用
级别1:12的因子FakeData = transform(FakeData,
DischargeMonth = factor(DischargeMonth, levels = 1:12))
答案 2 :(得分:0)
这是一个动物园解决方案。请注意,zoo FAQ#13讨论了形成网格g
。我们还将年和月转换为"yearmon"
类变量,表示为年份加分数月份(0 = 1月,1/12 = 2月,2月12日= 3月等)
library(zoo)
# create zoo object with yearmon index
DF <- FakeData
z <- zoo(DF[,3], yearmon(DF[,1] + (DF[,2]-1)/12))
# create grid g. Merge zero width zoo object based on it. Fill NAs with 0s.
g <- seq(start(z), end(z), 1/12)
z0 <- na.fill(merge(z, zoo(, g)), fill = 0)
给出了
> z0
Jan 2010 Feb 2010 Mar 2010 Apr 2010 May 2010 Jun 2010
149 113 110 99 110 96
Jul 2010 Aug 2010 Sep 2010 Oct 2010 Nov 2010 Dec 2010
108 0 0 0 0 0
Jan 2011 Feb 2011 Mar 2011 Apr 2011 May 2011 Jun 2011
0 0 91 72 119 130
Jul 2011 Aug 2011 Sep 2011
93 74 112
或转换为"ts"
类:
> as.ts(z0)
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2010 149 113 110 99 110 96 108 0 0 0 0 0
2011 0 0 91 72 119 130 93 74 112
请注意,如果z
是动物园对象,则coredata(z)
是其数据,time(z)
是其索引值。