如何将不一致的年度数据转换为五年平均值?
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
我是 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