pmax (параллельный максимум) эквивалент для ранга в R
-
06-07-2019 - |
Вопрос
Если у вас есть 4 судьи, и каждый из них выставляет оценку конкретному исполнителю или определенной теме, то можно получить 4 вектора, каждый из которых содержит оценку. Но хотелось бы превратить это в ранг, чтобы преодолеть инфляцию классов одним судьей по сравнению с другим. это легко
transform(assignment,judge1.rank=rank(judge1),judge2.rank=rank(judge2),
judge3.rank=rank(judge3), judge4.rank=rank(judge4))
Но тогда для каждой строки (исполнителя или темы) я хочу еще четыре столбца, в которых для каждой строки указывается ранг рангов (или параллельный ранг) для каждого судьи.
Я хотел бы сделать что-то вроде
prank(judge1.rank,judge2.rank,judge3.rank,judge4.rank)
Полагаю, его нужно будет выводить как фрейм данных.
Я подумал об использовании пакета изменения формы для слияния данных, но это только предварительная мысль.
Решение
Если я вас правильно понимаю, это будет делать то, что вы хотите:
## example data
set.seed(1)
judge <- data.frame(judge1 = sample(1:10), judge2 = sample(1:10),
judge3 = sample(1:10), judge4 = sample(1:10))
Мы вычисляем ранги для каждого судьи, используя sapply ()
, который возвращает матрицу рангов. Затем мы используем apply rank ()
для строк этой матрицы, чтобы вычислить ранги исполнителей / строк. Окончательная транспонирование возвращает результат в нужной ориентации.
> 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
Оберните это в функцию, и все готово:
prank <- function(df, ...) {
t(apply(sapply(df, rank, ...), 1, rank, ...))
}
Что дает:
> 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
...
позволяет передавать аргументы rank ()
, например, аргумент 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