Расширить и заполнить фрейм данных предыдущими значениями - PullRequest
0 голосов
/ 30 ноября 2018

Я застрял со следующей проблемой, которая может быть дубликатом, но не могу найти ответ

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

Мне удалось расширить столбец года и имени и иметь NA для столбца значения с

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

, но не удалось найти решение для заполнения столбца значения соответствующими элементами,zoo::na.locf() приходит на ум, но кажется, что для заполнения NA требуется только последнее значение?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы правы, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...