pmax (paralelo máximo) equivalente para rango en R
-
06-07-2019 - |
Pregunta
Si uno tiene 4 jueces y cada uno da una puntuación para un artista en particular o un tema en particular, entonces uno podría tener 4 vectores, cada uno con la puntuación. Pero a uno le gustaría convertir eso en un rango para superar la inflación de calificaciones de un juez en comparación con otro. eso es fácil
transform(assignment,judge1.rank=rank(judge1),judge2.rank=rank(judge2),
judge3.rank=rank(judge3), judge4.rank=rank(judge4))
Pero luego, para cada fila (intérprete o tema) quiero otras cuatro columnas que para cada fila indique el rango de rangos (o rango paralelo) para cada juez.
Me gustaría hacer algo como
prank(judge1.rank,judge2.rank,judge3.rank,judge4.rank)
Supongo que tendría que salir como un marco de datos.
Pensé en usar el paquete de remodelación para fundir los datos, pero eso es solo un pensamiento preliminar.
Solución
Si te entiendo correctamente, esto hará lo que quieras:
## example data
set.seed(1)
judge <- data.frame(judge1 = sample(1:10), judge2 = sample(1:10),
judge3 = sample(1:10), judge4 = sample(1:10))
Calculamos los rangos para cada juez usando sapply ()
que devuelve una matriz de rangos. Luego usamos aplicar rank ()
en las filas de esta matriz para calcular los rangos de intérprete / fila. Una transposición final recupera el resultado en la orientación requerida.
> t(apply(sapply(judge, rank), 1, rank))
judge1 judge2 judge3
[1,] 1.5 1.5 3.0
[2,] 3.0 1.5 1.5
[3,] 1.0 2.5 2.5
[4,] 2.0 3.0 1.0
[5,] 1.0 2.0 3.0
[6,] 2.5 1.0 2.5
[7,] 3.0 2.0 1.0
[8,] 3.0 1.0 2.0
[9,] 3.0 1.0 2.0
[10,] 1.0 3.0 2.0
Envuelva eso en una función y estará listo:
prank <- function(df, ...) {
t(apply(sapply(df, rank, ...), 1, rank, ...))
}
Que da:
> prank(judge)
judge1 judge2 judge3
[1,] 1.5 1.5 3.0
[2,] 3.0 1.5 1.5
[3,] 1.0 2.5 2.5
[4,] 2.0 3.0 1.0
[5,] 1.0 2.0 3.0
[6,] 2.5 1.0 2.5
[7,] 3.0 2.0 1.0
[8,] 3.0 1.0 2.0
[9,] 3.0 1.0 2.0
[10,] 1.0 3.0 2.0
El ...
permite pasar argumentos a rank ()
, por ejemplo, el argumento ties.method
:
> prank(judge, ties = "min")
judge1 judge2 judge3
[1,] 1 1 3
[2,] 3 1 1
[3,] 1 2 2
[4,] 2 3 1
[5,] 1 2 3
[6,] 2 1 2
[7,] 3 2 1
[8,] 3 1 2
[9,] 3 1 2
[10,] 1 3 2