我有一个面板数据集,我希望通过变量(列)对指定数量的时间段(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;弄清楚如何去做。
非常感谢您提前
答案 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)