使用以前的值扩展和填充数据框

CER*_*CER 4 r zoo dplyr

我遇到了以下可能重复但无法找到答案的问题

df <-structure(list(year = c(1980, 1980, 1983, 1983, 1986, 1986), 
name = c("aa", "bb", "aa", "bb", "aa", "bb"), value = c(1, 
2, 4, 3, 2, 5)), .Names = c("year", "name", "value"), row.names = c(NA, 
-6L), class = "data.frame")


  year name value
  1980   aa     1
  1980   bb     2
  1983   aa     4
  1983   bb     3
  1986   aa     2
  1986   bb     5
Run Code Online (Sandbox Code Playgroud)

我希望用过去几年的价值填补之间缺失的年份,以获得类似的东西

  year name value
  1980   aa     1
  1980   bb     2
  1981   aa     1
  1981   bb     2
  1982   aa     1
  1982   bb     2
  1983   aa     4
  1983   bb     3
  1984   aa     4
  1984   bb     3
  1985   aa     4
  1985   bb     3
  1986   aa     2
  1986   bb     5
  ....
Run Code Online (Sandbox Code Playgroud)

我设法扩展年份和名称列,并为值列具有NA

df %>%
  complete(year = seq(min(year), max(year)),name)
Run Code Online (Sandbox Code Playgroud)

但未能找到使用相应元素填充值列的解决方案.zoo::na.locf()浮现在脑海中,但似乎只需要最后一个值来填补NA?

Sti*_*ibu 5

你是正确的,zoo::na.locf()可以做你想要的.决定性因素是您需要name首先按列对数据框进行分组,以便使用适当的最后一个值填充空白name:

library(tidyr)
library(dplyr)
df %>%
  complete(year = seq(min(year), max(year)),name) %>%
  group_by(name) %>%
  mutate(value = zoo::na.locf(value))
## # A tibble: 14 x 3
## # Groups:   name [2]
##     year name  value
##    <dbl> <chr> <dbl>
##  1  1980 aa        1
##  2  1980 bb        2
##  3  1981 aa        1
##  4  1981 bb        2
##  5  1982 aa        1
##  6  1982 bb        2
##  7  1983 aa        4
##  8  1983 bb        3
##  9  1984 aa        4
## 10  1984 bb        3
## 11  1985 aa        4
## 12  1985 bb        3
## 13  1986 aa        2
## 14  1986 bb        5
Run Code Online (Sandbox Code Playgroud)