R:自动计算秩和
R: calculate rank sum automatically
给定 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 的解决方案相辅相成。
你可以sum()
the rank()
with 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
和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))
基础R
,可以使用ave
:
setNames(unique(ave(rank(x[,1]), x[,2], FUN=sum)), unique(x[,2]))
# M F
# 48.5 56.5
给定 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 的解决方案相辅相成。
你可以sum()
the rank()
with 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
和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))
基础R
,可以使用ave
:
setNames(unique(ave(rank(x[,1]), x[,2], FUN=sum)), unique(x[,2]))
# M F
# 48.5 56.5