2011-10-11 2 views
3

년 및 월별 사례가 포함 된 데이터 세트가 있습니다. 몇 개월이 누락되었습니다. 해당 달의 사례 수가 0 인 행을 만들고 싶습니다.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

감사합니다. 나는 방법이 있어야한다는 것을 알고있었습니다. 완전성을 위해 NAs를 0으로 대체해야하므로 대답은 다음과 같을 것입니다 : FakeData <- merge (allMonths, FakeData, all.x = TRUE) FakeData $ Cases [FakeData $ Cases)] <- 0 – JIm

+0

실제로 조금 단순화 할 수 있습니다. 나는 나의 대답을 업데이트했다. – Charlie

2

또 다른 해결책은 reshape 패키지에서 cast을 사용하는 것입니다. 그것은 단지 당신이 모든 개월 1:12 당신이 할 수 있으려면 2011 년을 위해 2010 년 달 1과 2에 대한 데이터의 누락 조합 0, 월 8, 9를 추가하는

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

주 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 월 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" 클래스 변환 : z 인 경우 동물원 객체가 coredata(z) 그 데이터,211 것을

> 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 

참고이 색인 값입니다.

+0

흥미 롭군요. 동물원은 지금 과장된 것 같습니다. – JIm

+0

@ 짐,하지만이게 정말 분석 끝인가요? 그렇지 않은 경우 모든 후속 프로세스는 문제점에 더 적합한 데이터 구조를 갖는 것이 좋습니다. –

관련 문제