用先前的值扩展并填充数据框

时间:2018-11-30 18:20:44

标签: r dplyr zoo

我陷入了以下问题,可能是重复的问题,但找不到答案

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

我想用过去几年的值填充之间的缺失年份,以获得类似的信息

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

我设法扩展了year和name列,并为value列提供了NAs

df %>%
  complete(year = seq(min(year), max(year)),name)

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

1 个答案:

答案 0 :(得分: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