首页 > 解决方案 > 如何使用 df2(t)/df2(t-1) 的比率轻松填写 df1(at time t) 的缺失值?

问题描述

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

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

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)
                      )

标签: rdplyrtidyr

解决方案


# 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

推荐阅读