按行设置行数平均值

时间:2018-02-16 16:49:01

标签: r moving-average

我有一个面板数据集,我希望通过变量(列)对指定数量的时间段(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 

我想要的是一个新的列/新数据框,其中Var 1的5年期间(1984-1988)的平均值有一个新变量,Var 2和var 3的平均变量等。

我还希望循环该功能,以便将其应用于我的数据集中的其他国家/地区。如果我能避免平均值混淆国家会很好,所以我想添加一些匹配的字符串模式(例如,对于%AUT中的代码%,例如,我有一个带有国家代码的变量)但我不能# 39;弄清楚如何去做。

非常感谢您提前

1 个答案:

答案 0 :(得分:0)

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)