如何有效地使用R来添加0个案例的摘要行?

时间:2011-10-11 16:39:55

标签: r plyr

我有一个数据集,包括按年和月的情况。缺少几个月,我想在这几个月创建一个案例数为零的行。

这是一个例子,我目前的蛮力方法。谢谢你的任何指示。显然,我是新人。

# 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

3 个答案:

答案 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)是其索引值。