如何轻松使用df2(t)/ df2(t-1)的比率来填充df1(在时间t)的缺失值?

时间:2018-06-28 16:15:09

标签: r dplyr tidyr

有两个数据框,第一个数据框缺少一些值,第二个数据框没有缺少值。规则是:

1:对于year(t) of df1,如果缺少year(t)的值,则使用year(t-1)*ratio的值。 df2的ratio = value of year(t) / value of year(t-1)

2:在df1中,2012年和2013年都没有数据,但是我们只需要估算2012年的缺失值,这是最新数据之后的一年。我们不必多年估算。

我的方法有点愚蠢。任何人都可以有更好的方法来解决此问题?

data2 = data.frame('population by age' = seq(5, 8, by = 1), 
                     '2008' = c(145391,
                                140621,
                                136150,
                                131944
                     ),  
                     '2009' = c(148566,
                                143943,
                                139367,
                                135083
                     ), 
                     '2010' = c(152330,
                                147261,
                                142555,
                                138172
                     ),  
                     '2011' = c(156630,
                                151387,
                                146491,
                                141905
                     ),
                     '2012' = c(133545,
                                129737,
                                126124,
                                122678
                      ),
                     '2013' = c(119397,
                                116093,
                                112666,
                                109174)) 


  data1 <- data.frame('grade' = seq(1, 4, by = 1), 
                                     '2008'= c(218701,
                                               NA,
                                               142190,
                                               NA),
                                     '2009' = c(NA,
                                                196398,
                                                155033,
                                                NA),
                                     '2010' = c(212512,
                                                NA,
                                                176268,
                                                143699),
                                     '2011' = c(218529,
                                                198933,
                                                NA,
                                                159103),
                      '2012' = c(NA,
                                 NA,
                                 NA,
                                 NA),
                      '2013' = c(NA,
                                 NA,
                                 NA,
                                 NA)
                      )

2 个答案:

答案 0 :(得分:0)

首先,使用要替换的值创建一个新的数据框。我正在使用包data.table来做到这一点;您可以根据需要尝试使用dplyr / tidyr解决方案。然后,替换data1中的NA。因为没有每个年级和年份的数据,所以仍然会有NA。因此,将所有内容放入while循环中:

library(data.table)

while( anyNA(data1[ncol(data1)]) ) {
  data1.sub <- copy(data1)
  for( t in 3:ncol(data1.sub) ) set( data1.sub, j = t, value = data1[[t-1]]*(data2[[t]]/data2[[t-1]]) )
  data1[ is.na(data1) ] <- data1.sub[ is.na(data1) ]
}

我用的是3:ncol(),因为X2008之前没有信息。结果如下:

> data1
  grade  X2008    X2009    X2010    X2011    X2012 X2013
1     1 218701 223476.9 212512.0 218529.0 186321.0 166581.8
2     2     NA 196398.0 200925.1 198933.0 170483.4 152554.2
3     3 142190 155033.0 176268.0 181134.8 155951.2 139310.5
4     4     NA       NA 143699.0 159103.0 137545.8 122405.2

如果在X2008之后使用for循环到所有列,则将使用your answer中的代码来完成相同的结果:

for (i in 1:nrow(data1)) {
  for (j in 3:ncol(data1)) { 
    if (is.na(data1[i,j])) data1[i,j] = data1[i,j-1]*data2[i,j]/data2[i,j-1]
} }

答案 1 :(得分:0)

# Find the column number of the last column with non-na value
  ind <- !is.na(data1)
  t1 <- tapply(data1[ind], col(data1)[ind],tail, 1)
  last_non_na_col <- as.numeric(tail(unlist(dimnames(t1)), n = 1))

  for (i in 1:nrow(data1)) {
    for (j in 3:(last_non_na_col+1)) { 
      if (is.na(data1[i,j])) {
        data1[i,j] = data1[i,j-1]*data2[i,j]/data2[i,j-1]
      }
    }
  }

输出将是这样。这正是我想要的。

 > data1
    grade  X2008    X2009    X2010    X2011    X2012 X2013
1     1 218701 223476.9 212512.0 218529.0 186321.0    NA
2     2     NA 196398.0 200925.1 198933.0 170483.4    NA
3     3 142190 155033.0 176268.0 181134.8 155951.2    NA
4     4     NA       NA 143699.0 159103.0 137545.8    NA