質問
4人のジャッジがいて、それぞれが特定の演技者または特定のトピックのスコアを与える場合、それぞれがスコアを含む4つのベクトルを持つことができます。 しかし、ある裁判官が別の裁判官と比較して等級インフレを克服するために、それをランクに変えたいと思います。 簡単です
transform(assignment,judge1.rank=rank(judge1),judge2.rank=rank(judge2),
judge3.rank=rank(judge3), judge4.rank=rank(judge4))
しかし、各行(パフォーマンスまたはトピック)ごとに、各行の各裁判官のランク(または並列ランク)を示す4つの列が必要です。
次のようなことをしたい
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
...
は、 ties.method
引数など、 rank()
への引数を渡すことができます:
> 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