按列对设置的行数进行平均
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)
我有一个面板数据集,我想在其中按变量(列)对指定数量的时间段 (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)