插入缺失年份以完成data.frame

时间:2018-03-22 15:55:55

标签: r dataframe

我创建了一个数据框,其中包含2000年至2010年每个州每年某种事件的数量(假装它们是枪支事件):

states <- c('Texas', 'Texas', 'Arizona', 'California', 'California')
incidents <- c(1, 1, 2, 1, 4)
years <- c(2000, 2008, 2004, 2002, 2007)

DF <- data.frame(states, incidents, years)

> DF
      states incidents years
1      Texas         1  2000
2      Texas         1  2008
3    Arizona         2  2004
4 California         1  2002
5 California         4  2007

我想插入行来完成数据集,例如2001年,2002年,2003年,2007年以及2009年和2010年德克萨斯州的零点。同样,除了2004年以外,亚利桑那州的所有年份均为零。加利福尼亚也是如此。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您可以使用tidyr::complete2010:2010填写遗失年份(0)和值。

library(tidyr)
DFfilled <- DF %>%
    complete(states, years = 2000:2010, 
             fill = list(incidents = 0)) %>%
    as.data.frame()

<强> PS:
如果您的数据中包含年份2010的条目(现在只有2008),则可以使用full_seq(years, 1)代替2000:2010

答案 1 :(得分:0)

我会通过使用data.frame创建一个人工mergeDF此data.frame来实现此目的:

states <- c('Texas', 'Texas', 'Arizona', 'California', 'California')
incidents <- c(1, 1, 2, 1, 4)
years <- c(2000, 2008, 2004, 2002, 2007)

DF <- data.frame(states, incidents, years)

tmp <- data.frame(years=rep(seq(min(DF$years), 
                          max(DF$years)),
                          each=length(unique(DF$states))), 
                  states=unique(DF$states) )
DF2 <- merge(DF, tmp, by=c('years','states'),all=T)
DF2[is.na(DF2$incidents),]$incidents <- 0