如何将不一致的年度数据转换为五年平均值?

How to transform inconsistent yearly data to quinquennial averages?

我是 R 的新手,正在尝试将我的年度不一致数据集(数据集不一定包含每年的数据,但包含某些变量)转换为五年平均值。我正在尝试构建一个 for 循环(尽管任何方法都被应用)来为已知年份的平均值生成一个新变量,但是根据年份有条件地制作已被证明是困难的。 换句话说,如果数据集包含所有五年的值,它将生成这五年的平均值(如果它有 4-2 年的数据,则同样的想法)如果它只有一年的数据,它将取值单个年份,同时还构造一个新的时间变量,该变量等于年份的 lowest/highest。

我尝试使用模拟数据来展示这一点(这是模拟 3 年的平均值,但我希望同样的方法适用于 5)

这是我此时的模拟数据,一个表示年份的变量,数据和国家代码。

df <- read.table(
text =
"Year, Data,Country
1,2,US
3,2,US
6,5,US
7,1,US
8,5,US
1,3,UK
2,5,UK
3,4,UK
4,3,UK
9,2,UK
", sep = ",", header = TRUE)
df

这是我想要实现的模拟数据。数据按 3 年平均值排序,并构造了一个表示年份的新变量,它取 'lowest' 年的值。 (我做了这 3 个平均值并包括了平均计算以简化)

df2 <- read.table(
text =
"Year, Data,Country,YearAvg,Average
1,2,US,1,4/2=2
3,2,US,4,5/1=5
6,5,US,7,3
7,1,US,NA,NA
8,5,US,NA,NA
1,3,UK,1,12/3=4
2,5,UK,4,3
3,4,UK,7,2
4,3,UK,NA,NA
9,2,UK,NA,NA
", sep = ",", header = TRUE)
df2

关于如何在 R 中编码的任何建议?

编辑:

df <- read.table(
text =
"year, Data,country
1,2,US
3,2,US
4,5,US
5,1,US
6,3,US
7,5,US
8,4,US
9,3,US
10,4,US
11,9,US
", sep = ",", header = TRUE)
df

df2 = setkey(setDT(df), year, country)[CJ(year = seq(min(year), max(year)), country = unique(country))
                                 ][ , avg := frollmean(Data, 5, align = "left", na.rm = TRUE), by = country
                                    ][order(country, year)
                                      ][(rowid(country) %% 5) == 1]
df2

这里有一个data.table选项。

  • 首先会扩展行以填充每个国家/地区缺失的年份(因此即使没有数据,您也会有第 1、2、3 年等)
  • 然后你 frollmean 得到一个滚动平均值并忽略 Data 中的 NA (左对齐到连续 n 年的平均值)
  • 您可以 select 每 3 年一次 (rowid(Country) %% 3) == 1 (并将 3 更改为 5 以每 5 年一次)

让我知道这是否符合您的想法。

library(data.table)

setkey(setDT(df), Year, Country)[CJ(Year = seq(min(Year), max(Year)), Country = unique(Country))
                                 ][ , avg := frollmean(Data, 3, align = "left", na.rm = TRUE), by = Country
                                    ][order(Country, Year)
                                      ][(rowid(Country) %% 3) == 1]

输出

   Year Data Country avg
1:    1    3      UK   4
2:    4    3      UK   3
3:    7   NA      UK   2
4:    1    2      US   2
5:    4   NA      US   5
6:    7    1      US   3