Интерполировать аккуратные данные в R - PullRequest
1 голос
/ 07 октября 2019

У меня есть данные о населении за годы: 1966, 1971, 1976. Я хотел бы создать еще один аккуратный фрейм данных, который включает пропущенные годы (т.е. 1967, 1968, 1969, 1970, 1972, 1973, 1974, 1975). Линейная интерполяция в порядке.

Я думаю, approx или approxfun, но я не знаю, как.

library("tidyverse")

df <- tibble(
  year = c(1976, 1971, 1966, 1976, 1971, 1966, 1976, 1971, 1966),
  age_min = c(rep(0, 3), rep(5, 3), rep(10, 3)),
  population = c(180, 200, 300, 150, 250, 450, 25, 50, 150)
)

p1971 <- filter(df, year == 1971)
p1976 <- filter(df, year == 1976)

ggplot(data = p1971, aes(x = age_min, y = population)) +
  # 1971 population distribution
  geom_point(size = 4, color = "red") +
  geom_line(color = "red", size = 1.5) +
  geom_text(label = year, nudge_y = 9) +

  # 1976 population distribution
  geom_point(data = p1976, aes(x = age_min, y = population), size = 3, color = "blue") +
  geom_line(data = p1976, aes(x = age_min, y = population), color = "blue", size = 1.5) +
  geom_text(data = p1976, aes(x = age_min, y = population), label = p1976$year, nudge_y = -9)

1 Ответ

1 голос
/ 07 октября 2019

Согласно ?na.approx (из zoo)

Пропущенные значения (NA) заменяются линейной интерполяцией с помощью приблизительной или кубической сплайн-интерполяции с помощью сплайна, соответственно l

Итак, мы могли бы использовать na.approx после создания пропущенного года с complete

library(dplyr)
library(tidyr)
library(zoo)
df %>%
   complete(age_min, year = 1966:1976) %>%
   group_by(age_min) %>%
   mutate(population =na.approx(population, na.rm = FALSE))
...