按列对设置的行数进行平均

Averaging by column for set number of rows

我有一个面板数据集,我想在其中按变量(列)对指定数量的时间段 (t) 进行平均。

一个例子:

Country    Year    Var 1        Var 2       Var 3
Austria   1984      1           3.6          95
Austria   1985      2           4.1          94.6
Austria   1986      1           2.6          93.6
Austria   1987      1            3           94.4  
Austria   1988      1           3.9          95.2 

然后我想要的是一个新的 column/new 数据框,其中包含一个新变量,用于 Var 1 的 5 年期间(1984-1988)的平均值,一个变量用于 Var 2 和 var 3 的平均值等等

我还想循环这个函数,这样我就可以将它应用到我数据集中的其他国家。如果我能避免平均混淆国家,那就太好了,所以我正在考虑添加一些匹配的字符串模式(例如,对于代码 %in% AUT 在这种情况下,我有一个带有国家代码的变量)但我不能'不知道该怎么做。

非常感谢您

1) 使用最后注释中的示例输入,从行名称中读取国家和年份并将年份舍入到当前 5 的末尾年期间,以便从 1984 年到 1988 年的每一年都四舍五入到 1988 年,依此类推。然后使用 aggregate 按国家和年份计算每列的平均值。没有使用包。

By0 <- read.table(text = rownames(DF), col.names = c("Country", "Year"))
By <- transform(By0, Year = 5 * ((Year - min(Year)) %/% 5) + min(Year) + 4)

aggregate(DF, By, mean)

给出以下内容:

    Country Year Var 1 Var 2 Var 3
1 Australia 1988   1.6 18.46 95.52
2   Austria 1988   1.2  3.44 94.56

2) 或者如果想要的是将列附加到原始数据框 lapply 上,使用 ave 取平均值Country 每个:

out <- cbind(DF, lapply(DF, function(x) with(By, ave(x, Country, Year, FUN = mean))))
names(out) <- c(names(DF), paste("Mean", names(DF)))

给予:

> out
               Var 1 Var 2 Var 3 Mean Var 1 Mean Var 2 Mean Var 3
Austria 1984       1   3.6  95.0        1.2       3.44      94.56
Austria 1985       2   4.1  94.6        1.2       3.44      94.56
Austria 1986       1   2.6  93.6        1.2       3.44      94.56
Austria 1987       1   3.0  94.4        1.2       3.44      94.56
Austria 1988       1   3.9  95.2        1.2       3.44      94.56
Australia 1984     1   3.6  95.0        1.6      18.46      95.52
Australia 1985     2   4.1  94.6        1.6      18.46      95.52
Australia 1986     1   2.6  93.6        1.6      18.46      95.52
Australia 1987     1   3.0  94.4        1.6      18.46      95.52
Australia 1988     3  79.0 100.0        1.6      18.46      95.52

备注

使用的输入,可重复显示,是:

Lines <- "
Var 1,Var 2,Var 3
Austria 1984,1,3.6,95
Austria 1985,2,4.1,94.6
Austria 1986,1,2.6,93.6
Austria 1987,1,3,94.4
Austria 1988,1,3.9,95.2
Australia 1984,1,3.6,95
Australia 1985,2,4.1,94.6
Australia 1986,1,2.6,93.6
Australia 1987,1,3,94.4
Australia 1988,3,79,100"

DF <- read.csv(text = Lines, check.names = FALSE)