Domanda

Se uno ha 4 giudici e ognuno di essi dà un punteggio per un particolare interprete o un particolare argomento, allora si potrebbero avere 4 vettori con ognuno contenente il punteggio. Ma uno vorrebbe trasformarlo in un grado per superare l'inflazione di grado da parte di un giudice rispetto a un altro. è facile

transform(assignment,judge1.rank=rank(judge1),judge2.rank=rank(judge2),
                     judge3.rank=rank(judge3), judge4.rank=rank(judge4))

Ma poi per ogni riga (esecutore o argomento) voglio altre quattro colonne che per ogni riga indicano il grado dei ranghi (o grado parallelo) per ciascun giudice.

Vorrei fare qualcosa come

prank(judge1.rank,judge2.rank,judge3.rank,judge4.rank)

Suppongo che dovrebbe essere prodotto come frame di dati.

Ho pensato di usare il pacchetto reshape per fondere i dati, ma questo è solo un pensiero preliminare.

È stato utile?

Soluzione

Se ti capisco correttamente, questo farà quello che vuoi:

## example data
set.seed(1)
judge <- data.frame(judge1 = sample(1:10), judge2 = sample(1:10),
                    judge3 = sample(1:10), judge4 = sample(1:10))

Calcoliamo i ranghi per ogni giudice usando sapply () che restituisce una matrice di ranghi. Quindi usiamo applicare rank () sulle righe di questa matrice per calcolare i ranghi di performer / row. Una trasposizione finale riporta il risultato nell'orientamento richiesto.

> 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

Avvolgilo in una funzione e sei a posto:

prank <- function(df, ...) {
    t(apply(sapply(df, rank, ...), 1, rank, ...))
}

Che dà:

> 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

... consente di passare argomenti per rank () , ad esempio l'argomento 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top