2011-10-11 81 views
3

我有一个数据集,包括年份和月份的情况。有些月份不见了,我想创建这些月份的案例数为零的行。如何有效地使用R添加0个案例的摘要行?

这里是一个例子,以及我目前的蛮力方法。感谢任何指针。很显然,我是这个新手。

# 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 

回答

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 
+0

谢谢,我知道一定有办法。为了完整性,我需要用0替换NA,所以我认为答案是: FakeData < - merge(allMonths,FakeData,all.x = TRUE) FakeData $ Cases [is.na(FakeData $ Cases )] < - 0 – JIm

+0

你实际上可以简化一下。我更新了我的答案。 – Charlie

2

另一种解决方案是使用castreshape包。

require(reshape) 
cast(Fakedata, DischargeYear + DischargeMonth ~ ., add.missing = TRUE, fill = 0) 

注意,它只会增加0数据丢失的组合,8月,9年和2010个1和2,2011年全年为确保您有所有月份1:12,你可以将DischargeMonth的定义更改为级别1:12的因子使用

FakeData = transform(FakeData, 
    DischargeMonth = factor(DischargeMonth, levels = 1:12)) 
+0

Ramnath,这很有帮助。选择重塑之间我有点不知所措? reshape2,plyr,所有这些看起来都很相似。也许我应该选择一个并尝试好好学习它? – JIm

0

这是一个动物园解决方案。请注意,zoo FAQ#13讨论形成网格,g。此外,我们转换的年份和月份,其给出了一个"yearmon"类变量,表示为一年加一个月分数(0 =月,1/12 =月,2/12 =月等)

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)是它的指数值。

+0

有趣的是,虽然动物园目前似乎对我有点矫枉过正。 – JIm

+0

@Jim,但这真的是你分析的结局吗?如果不是,所有后续流程可能会受益于具有更适合问题的数据结构。 –