如果一个人有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)

我想它必须输出为数据帧。

我想过使用reshape包来融化数据,但这只是一个初步想法。

有帮助吗?

解决方案

如果我理解正确,这将做你想做的事:

## 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top