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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top