いくつかの(実際には約60)列のそれぞれについて、グループごとに加重平均を取得したいと考えています。この質問は、質問されたばかりのデータ フレームでグループ平均を計算するために ave を繰り返し適用することと非常によく似ています。
これまでに、加重平均を取得する 2 つの方法を考え出しました。
sapply
列ごとに個別のステートメントを使用する- の
sapply
中にステートメントを入れるfor-loop
apply
ただし、ステートメントをステートメント内に挿入する方法、sapply
またはその逆の方法が必要であると感じていfor-loop
ます。私は成功せずに多くの順列を試みました。機能も見ましたsweep
。
ここに私がこれまでに持っているコードがあります。
df <- read.table(text= "
region state county weights y1980 y1990 y2000
1 1 1 10 100 200 50
1 1 2 5 50 100 200
1 1 3 120 1000 500 250
1 1 4 2 25 100 400
1 1 4 15 125 150 200
2 2 1 1 10 50 150
2 2 2 10 10 10 200
2 2 2 40 40 100 30
2 2 3 20 100 100 10
", header=TRUE, na.strings=NA)
# add a group variable to the data set
group <- paste(df$region, '_', df$state, '_', df$county, sep = "")
df <- data.frame(group, df)
# obtain weighted averages for y1980, y1990 and y2000
# one column at a time using one sapply per column
sapply(split(df, df$group), function(x) weighted.mean(x$y1980, w = x$weights))
sapply(split(df, df$group), function(x) weighted.mean(x$y1990, w = x$weights))
sapply(split(df, df$group), function(x) weighted.mean(x$y2000, w = x$weights))
# obtain weighted average for y1980, y1990 and y2000
# one column at a time using a for-loop
y <- matrix(NA, nrow=7, ncol=3)
group.b <- df[!duplicated(df$group), 1]
for(i in 6:8) {
y[,(i-5)] <- sapply(split(df[,c(1:5,i)], df$group), function(x) weighted.mean(x[,6], w = x$weights))
}
# add weighted averages to the original data set
y2 <- data.frame(group.b, y)
colnames(y2) <- c('group','ave1980','ave1990','ave2000')
y2
y3 <- merge(df, y2, by=c('group'), all = TRUE)
y3
最近質問ばかりで申し訳ありませんが、アドバイスをよろしくお願いします。
表示するように編集y3
group region state county weights y1980 y1990 y2000 ave1980 ave1990 ave2000
1 1_1_1 1 1 1 10 100 200 50 100.0000 200.0000 50.0000
2 1_1_2 1 1 2 5 50 100 200 50.0000 100.0000 200.0000
3 1_1_3 1 1 3 120 1000 500 250 1000.0000 500.0000 250.0000
4 1_1_4 1 1 4 2 25 100 400 113.2353 144.1176 223.5294
5 1_1_4 1 1 4 15 125 150 200 113.2353 144.1176 223.5294
6 2_2_1 2 2 1 1 10 50 150 10.0000 50.0000 150.0000
7 2_2_2 2 2 2 10 10 10 200 34.0000 82.0000 64.0000
8 2_2_2 2 2 2 40 40 100 30 34.0000 82.0000 64.0000
9 2_2_3 2 2 3 20 100 100 10 100.0000 100.0000 10.0000