studio - superponer graficas en r
R: calcular la suma de rango automáticamente (3)
Dado x <- cbind(c(10,15,20,20,25,30,30,30,35,40,40,40,40,45),rep(c(''M'',''F''),7))
, quiero calcular las sumas de rango de las categorías M y F automáticamente , sin hacerlo a mano. Lo que no pude entender es cómo ajustar los números de rango cuando hay un empate. En este caso, los números 3 y 4 son ambos 20 y comparten el valor de rango de 3.5 (en lugar de 3 y 4). Del mismo modo, # 6 ~ # 8 tienen el valor de rango de 7, y # 10 ~ # 13 tienen 11.5. Sin este ajuste, las sumas serían incorrectas.
#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
Probé table()
y duplicated()
, pero no pude entender cómo juntar cosas. ¿Algunas ideas?
EDITAR: Mi agradecimiento a konvas por sugerir rank()
, que funciona además de la solución de bgoldst.
Base R
, puedes usar ave
:
setNames(unique(ave(rank(x[,1]), x[,2], FUN=sum)), unique(x[,2]))
# M F
# 48.5 56.5
Con 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))
Puede sum()
el rank()
con 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