R:自动计算秩和

时间:2015-04-09 09:31:37

标签: r math sum duplicates rank

鉴于x <- cbind(c(10,15,20,20,25,30,30,30,35,40,40,40,40,45),rep(c('M','F'),7)),我想自动计算M和F 类别的等级总和,而不是手动完成。我无法弄清楚的是如何在有平局时调整排名。在这种情况下,#3和#4都是20,因此共享秩值3.5(而不是3和4)。同样,#6~#8的等级值为7,#10~#13的等级值为11.5。如果没有这种调整,总和就会出错。

#Wrong

sum(which(x[,2]=='F')) # =56

sum(which(x[,2]=='M')) # =49

#Right

sum(1,3.5,5,7,9,11.5,11.5) # =56.5

sum(2,3.5,7,7,11.5,11.5,14) # =48.5

我已经尝试了table()duplicated(),但无法弄清楚如何将事情拼凑在一起。有什么想法吗?

编辑:感谢konvas建议rank(),除了bgoldst的解决方案之外还有效。

3 个答案:

答案 0 :(得分:4)

您可sum() rank()aggregate()

x <- data.frame(age=c(10,15,20,20,25,30,30,30,35,40,40,40,40,45),sex=rep(c('M','F'),7));
aggregate(rank(age)~sex, x, sum );
##   sex rank(age)
## 1   F      56.5
## 2   M      48.5

答案 1 :(得分:1)

使用dplyr

library(dplyr)
x <- cbind(c(10,15,20,20,25,30,30,30,35,40,40,40,40,45),rep(c('M','F'),7))
data.frame(x) %>% mutate(rank=rank(X1)) %>% group_by(X2) %>% summarise(sum(rank))

答案 2 :(得分:1)

基础R,您可以使用ave

setNames(unique(ave(rank(x[,1]), x[,2], FUN=sum)), unique(x[,2]))
#    M    F 
# 48.5 56.5