我是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