【问题标题】:Adding rows and interpolating values添加行和插值
【发布时间】:2021-03-22 17:20:30
【问题描述】:

我有一个数据框,其中包含年份、GDP 和人口的字符串数据和值。该系列在 2010 年至 2100 年间每 5 年为每个国家/地区提供。

Model Scenario Year population Country gdp SSP Version Date
1 OECD SSP2_v9_130325 2010 0.102 Aruba 0.00247 SSP2 v9 130325
2 OECD SSP2_v9_130325 2015 0.112 Aruba 0.00335 SSP2 v9 130325
3 OECD SSP2_v9_130325 2020 0.119 Aruba 0.00431 SSP2 v9 130325
4 OECD SSP2_v9_130325 2025 0.125 Aruba 0.00559 SSP2 v9 130325
5 OECD SSP2_v9_130325 2030 0.131 Aruba 0.00722 SSP2 v9 130325
6 OECD SSP2_v9_130325 2035 0.136 Aruba 0.00918 SSP2 v9 130325

我想通过为每个中间年份添加行并插入 GDP 和人口来计算每年的 gdp 和人口。我已经按国家分组并使用了

complete(Year=full_seq(2010:2100,1)) %>% fill(Model, Scenario, Version, SSP, Date)

创建年份并填充保持不变的变量。我得到了 GDP 和人口的 NA,无法计算出如何在现有值之间进行插值。

Country Year Model Scenario population gdp SSP Version Date
1 Afghanistan 2010 OECD SSP2_v9_130325 28.0 0.0159 SSP2 v9 130325
2 Afghanistan 2011 OECD SSP2_v9_130325 NA NA SSP2 v9 130325
3 Afghanistan 2012 OECD SSP2_v9_130325 NA NA SSP2 v9 130325
4 Afghanistan 2013 OECD SSP2_v9_130325 NA NA SSP2 v9 130325
5 Afghanistan 2014 OECD SSP2_v9_130325 NA NA SSP2 v9 130325
6 Afghanistan 2015 OECD SSP2_v9_130325 31.8 0.0206 SSP2 v9 130325

我尝试了 approx 和 approxm,但无法使它们工作。 谢谢

【问题讨论】:

标签: r


【解决方案1】:

您可以使用 zoo 包中的 na.approxNA 替换为插值。

library(tidyverse)
library(zoo)

df %>%
  group_by(Country) %>%
  complete(Year = full_seq(2010:2100, 1)) %>% 
  fill(Model, Scenario, Version, SSP, Date) %>%
  mutate_at(vars(population, gdp), na.approx, rule = 2)

Country  Year Model Scenario       population     gdp SSP   Version   Date
   <chr>   <dbl> <chr> <chr>               <dbl>   <dbl> <chr> <chr>    <int>
 1 Aruba    2010 OECD  SSP2_v9_130325      0.102 0.00247 SSP2  v9      130325
 2 Aruba    2011 OECD  SSP2_v9_130325      0.104 0.00265 SSP2  v9      130325
 3 Aruba    2012 OECD  SSP2_v9_130325      0.106 0.00282 SSP2  v9      130325
 4 Aruba    2013 OECD  SSP2_v9_130325      0.108 0.00300 SSP2  v9      130325
 5 Aruba    2014 OECD  SSP2_v9_130325      0.11  0.00317 SSP2  v9      130325
 6 Aruba    2015 OECD  SSP2_v9_130325      0.112 0.00335 SSP2  v9      130325
 7 Aruba    2016 OECD  SSP2_v9_130325      0.113 0.00354 SSP2  v9      130325
 8 Aruba    2017 OECD  SSP2_v9_130325      0.115 0.00373 SSP2  v9      130325
 9 Aruba    2018 OECD  SSP2_v9_130325      0.116 0.00393 SSP2  v9      130325
10 Aruba    2019 OECD  SSP2_v9_130325      0.118 0.00412 SSP2  v9      130325
# … with 81 more rows

我以为你想group_by Country。此外,这包括rule = 2 以在时间点范围之外进行推断(您的样本数据仅到 2035 年)。 2035 年以后的外推值将根据最新值保持不变。

如果您想探索除插值之外的外插替代方案,您可以尝试使用na.spline 也来自zoo

df %>%
  group_by(Country) %>%
  complete(Year = full_seq(2010:2100,1)) %>% 
  fill(Model, Scenario, Version, SSP, Date) %>%
  mutate_at(vars(population, gdp), na.spline, method = "natural")

在这里您可以看到 2035 年之后的外推值的差异:

...
21 Aruba    2030 OECD  SSP2_v9_130325      0.131 0.00722 SSP2  v9      130325
22 Aruba    2031 OECD  SSP2_v9_130325      0.132 0.00759 SSP2  v9      130325
23 Aruba    2032 OECD  SSP2_v9_130325      0.133 0.00798 SSP2  v9      130325
24 Aruba    2033 OECD  SSP2_v9_130325      0.134 0.00837 SSP2  v9      130325
25 Aruba    2034 OECD  SSP2_v9_130325      0.135 0.00877 SSP2  v9      130325
26 Aruba    2035 OECD  SSP2_v9_130325      0.136 0.00918 SSP2  v9      130325
27 Aruba    2036 OECD  SSP2_v9_130325      0.137 0.00959 SSP2  v9      130325
28 Aruba    2037 OECD  SSP2_v9_130325      0.138 0.00999 SSP2  v9      130325
29 Aruba    2038 OECD  SSP2_v9_130325      0.139 0.0104  SSP2  v9      130325
30 Aruba    2039 OECD  SSP2_v9_130325      0.140 0.0108  SSP2  v9      130325
31 Aruba    2040 OECD  SSP2_v9_130325      0.141 0.0112  SSP2  v9      130325
32 Aruba    2041 OECD  SSP2_v9_130325      0.142 0.0116  SSP2  v9      130325
33 Aruba    2042 OECD  SSP2_v9_130325      0.143 0.0120  SSP2  v9      130325
34 Aruba    2043 OECD  SSP2_v9_130325      0.144 0.0124  SSP2  v9      130325
35 Aruba    2044 OECD  SSP2_v9_130325      0.145 0.0128  SSP2  v9      130325
...

数据

df <- structure(list(Model = c("OECD", "OECD", "OECD", "OECD", "OECD", 
"OECD"), Scenario = c("SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325", 
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325"), Year = c(2010L, 
2015L, 2020L, 2025L, 2030L, 2035L), population = c(0.102, 0.112, 
0.119, 0.125, 0.131, 0.136), Country = c("Aruba", "Aruba", "Aruba", 
"Aruba", "Aruba", "Aruba"), gdp = c(0.00247, 0.00335, 0.00431, 
0.00559, 0.00722, 0.00918), SSP = c("SSP2", "SSP2", "SSP2", "SSP2", 
"SSP2", "SSP2"), Version = c("v9", "v9", "v9", "v9", "v9", "v9"
), Date = c(130325L, 130325L, 130325L, 130325L, 130325L, 130325L
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
"6"))

【讨论】:

  • 谢谢本。这正是我一直在寻找的。我的数据继续到 2100,但我只显示了标题。我可以插值,但会使用线性插值(na.approx)。再次感谢
猜你喜欢
  • 2017-04-06
  • 2019-08-07
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
相关资源
最近更新 更多