继续我以前的(已回答)question。
说我有这个数据,
> df
rank1 rank2 rank3 rank4 rank5
1 A B C D E
2 A C B D E
3 C A B E D
4 B A C D E
5 A B D C E
我设法创建了按项目排名的频率表(感谢akrun),
> df.frequency
ranking
items 1 2 3 4 5
A 3 2 0 0 0
B 1 2 2 0 0
C 1 1 2 1 0
D 0 0 1 3 1
E 0 0 0 1 4
> str(df.frequency)
'table' int [1:5, 1:5] 3 1 1 0 0 2 2 1 0 0 ...
- attr(*, "dimnames")=List of 2
..$ items : chr [1:5] "A" "B" "C" "D" ...
..$ ranking: chr [1:5] "1" "2" "3" "4" ...
在Excel中,我使用=SUMPRODUCT($B$1:$F$1,B2:F2)/SUM(B2:F2)
来获取加权平均值
1 2 3 4 5 Mean
A 3 2 0 0 0 1.4
B 1 2 2 0 0 2.2
C 1 1 2 1 0 2.6
D 0 0 1 3 1 4
E 0 0 0 1 4 4.8
在R中,如何计算权重为等级的每个项目的加权平均值?我也想计算SD和中位数。
答案 0 :(得分:1)
你在寻找像这样简单的东西:
> a<-1:dim(df)[1] ### colnames
> z<-0
> b<-apply(df,1,function(x) x/sum(x)) ### ratio
> for(i in 1:dim(df)[1]){
+ z[i]<-sum(a*b[i,]) ### column weighted ratio
+ }
> z
[1] 1.4 2.2 2.6 4.0 4.8
如果你想将它添加到专栏中,只需要cboi
> cbind(x,z)
1 2 3 4 5 z
1 3 1 1 0 0 1.4
2 2 2 1 0 0 2.2
3 0 2 2 1 0 2.6
4 0 0 1 3 1 4.0
5 0 0 0 1 4 4.8
答案 1 :(得分:0)
受@ TonyHellmuth解决方案的启发,这也可以通过
解决cbind(tbl, z= c(seq_len(dim(tbl)[1])%*% t(tbl)/rowSums(tbl)))
# 1 2 3 4 5 z
#A 3 2 0 0 0 1.4
#B 1 2 2 0 0 2.2
#C 1 1 2 1 0 2.6
#D 0 0 1 3 1 4.0
#E 0 0 0 1 4 4.8
tbl <- table(unlist(df), c(col(df)))