题
如果一个人有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
不隶属于 StackOverflow