【问题标题】:Extend and fill up dataframe with previous values用以前的值扩展和填充数据框
【发布时间】:2019-05-02 22:12:27
【问题描述】:

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

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

我设法扩展了年份和名称列,并为 value 列设置了 NAs

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

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

【问题讨论】:

    标签: r dataframe dplyr zoo


    【解决方案1】:

    你是对的,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
    

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 2013-12-23
      • 2019-04-18
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 2018-07-02
      相关资源
      最近更新 更多