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



我是R的新手,正试图将我的年度不一致数据集(数据集不一定包含每年的数据,但包含一些变量的数据(转换为五年平均值。我正试图构建一个for循环(尽管任何方法都适用(,为已知年份的平均值生成一个新的变量,但有条件地根据年份进行手工制作已经证明是困难的。换言之,如果数据集包含所有五年的值,它将生成五年的平均值(如果它有4-2年的数据,这一想法也是一样的(,如果它只有一年的数据时,它将取一年的值同时构建一个新的时间变量,该变量等于这些年中最低/最高的一年。

我试着用模拟数据来证明这一点(这是对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年平均值排序,并构建了一个新的变量来表示年份,该变量取"最低"年份的值。(我做了这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选项。

  • First将展开行以填充每个国家/地区缺失的年份(因此,即使没有数据,也会有年份1、2、3等(
  • 然后frollmean得到滚动平均值,忽略Data中的NA(向左对齐到随后n年的平均值(
  • 您可以使用(rowid(Country) %% 3) == 1每3年选择一次(并将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

最新更新