推断从去年到给定年份可用的行

Extrapollate rows from the last year available up until a given year

我有以下数据:

library(data.table)  
df <- fread(
    "A   B  C  D  E  F  iso   year   
    0   A   NA  1  NA  NA  NLD   2009   
    1   Y   NA  2  NA  NA  NLD   2010   
    0   Q   NA  3  NA  NA  AUS   2011   
    1   NA  NA  4  NA  NA  AUS   2012 
    0   0   NA  7  NA  NA  NLD   2011  
    0   NA  1   NA  1  NA  ECU   2009   
    1   NA  0   NA  2  0   ECU   2010    
    1   NA  0   NA  2  0   ECU   2011    
    0   NA  0   NA  3  2   BRA   2011   
    1   NA  0   NA  4  NA  BRA   2012",
    header = TRUE
)

我想为每个国家/地区推断数据集中最后一年的条目,直至特定年份。例如,我想使用 df 中每个国家的最后一年(NLD=2011,AUS=2012,BRA=2012,ECU=2011),创建到 2014 年的条目。换句话说,我会喜欢复制这些条目,但随着年份的变化,直到 2014 年的最后一个可用年份。

期望的输出:

library(data.table)  
df <- fread(
    "A   B  C  D  E  F  iso   year   
    0   A   NA  1  NA  NA  NLD   2009   
    1   Y   NA  2  NA  NA  NLD   2010   
    0   Q   NA  3  NA  NA  AUS   2011   
    1   NA  NA  4  NA  NA  AUS   2012
    1   NA  NA  4  NA  NA  AUS   2013 
    1   NA  NA  4  NA  NA  AUS   2014    
    0   0   NA  7  NA  NA  NLD   2011  
    0   0   NA  7  NA  NA  NLD   2012 
    0   0   NA  7  NA  NA  NLD   2013 
    0   0   NA  7  NA  NA  NLD   2014 
    0   NA  1   NA  1  NA  ECU   2009   
    1   NA  0   NA  2  0   ECU   2010   
    0   NA  0   NA  3  0   BRA   2011   
    1   NA  0   NA  4  0   BRA   2011   
    1   NA  0   NA  2  0   ECU   2011   
    1   NA  0   NA  2  0   ECU   2012
    1   NA  0   NA  2  0   ECU   2013 
    1   NA  0   NA  2  0   ECU   2014    
    0   NA  0   NA  3  2   BRA   2011   
    1   NA  0   NA  4  NA  BRA   2012
    1   NA  0   NA  4  NA  BRA   2013
    1   NA  0   NA  4  NA  BRA   2014",
    header = TRUE
)

但我真的不知道从哪里开始。最简单的方法是什么?

编辑:在对实际数据进行测试时,我注意到在表述问题时我忽略了数据集的一个方面。在实际数据集中,除了年份之外,行中还有一个独特的方面(A 列)。

library(data.table)  
df <- fread(
    "A   B  C  D  E  F  iso   year   
    1   A   NA  1  NA  NA  NLD   2009   
    1   Y   NA  2  NA  NA  NLD   2010   
    1   Q   NA  3  NA  NA  AUS   2011   
    1   NA  NA  4  NA  NA  AUS   2012 
    1   0   NA  7  NA  NA  NLD   2011  
    1   NA  1   NA  1  NA  ECU   2009   
    1   NA  0   NA  2  0   ECU   2010    
    1   NA  0   NA  2  0   ECU   2011    
    1   NA  0   NA  3  2   BRA   2011   
    1   NA  0   NA  4  NA  BRA   2012
    0   A   NA  1  NA  NA  NLD   2009   
    0   Y   NA  2  NA  NA  NLD   2010   
    0   Q   NA  3  NA  NA  AUS   2011   
    0   NA  NA  4  NA  NA  AUS   2012 
    0   0   NA  7  NA  NA  NLD   2011  
    0   NA  1   NA  1  NA  ECU   2009   
    0   NA  0   NA  2  0   ECU   2010    
    0   NA  0   NA  2  0   ECU   2011    
    0   NA  0   NA  3  2   BRA   2011   
    0   NA  0   NA  4  NA  BRA   2012",
    header = TRUE
)

我尝试在这方面调整 Ronak 的结果:

df <- df %>%
  group_by(iso, A) %>%
  slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
  mutate(year = first(year):2014)
###
df <- df %>%
  #If not arranged by year
  arrange(iso, year, A)
  group_by(iso) %>%
  complete(year = seq(min(year), 2014)) %>%
  fill(B:F)

上面的代码有效,但在我的实际数据上给出了错误:

Error: Column `year` must be length 18 (the group size) or one, not 21

底部选项应用于示例时出现以下错误:

Error in group_by(iso) : object 'iso' not found

要复制最后一行,我们可以 group_by iso 并在每个组中重复最后一行

df %>%
  group_by(iso) %>%
  slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
  mutate(year = first(year):2014)

对于更新后的数据,其中 year 个值重复

df %>%
  group_by(iso) %>%
  mutate(row = row_number()) %>%
  slice(row, rep(n(), 2014 - last(year))) %>%
  mutate(year = c(year[1:max(row)], year[max(row)] + 1:(2014 - year[max(row)]))) %>%
  select(-row)

#       A B         C     D     E     F iso    year
#   <int> <chr> <int> <int> <int> <int> <chr> <int>
# 1     1 Q        NA     3    NA    NA AUS    2011
# 2     1 NA       NA     4    NA    NA AUS    2012
# 3     0 Q        NA     3    NA    NA AUS    2011
# 4     0 NA       NA     4    NA    NA AUS    2012
# 5     0 NA       NA     4    NA    NA AUS    2013
# 6     0 NA       NA     4    NA    NA AUS    2014
# 7     1 NA        0    NA     3     2 BRA    2011
# 8     1 NA        0    NA     4    NA BRA    2012
# 9     0 NA        0    NA     3     2 BRA    2011
#10     0 NA        0    NA     4    NA BRA    2012
# … with 20 more rows