No.22968 【R】apply()関数の使い方  【明石】 2020/10/14(Wed) 09:52

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。
改めて御礼を申し上げます。
ありがとうございます。

apply()関数をつかった降順ソートについて,ご教示をいただきたいと思います。
何卒どうぞよろしくお願いいたします。

---------------------------------

簡単な例題でお示しをします。

5行3列の行例を作成します。
カラムのラベルは,月の名称をお借りしました。
v <- sample(1:15)
mat <- matrix(v, nc=3)
colnames(mat) <- month.name[1:3]

> mat
January February March
[1,] 13 10 8
[2,] 12 11 14
[3,] 2 1 6
[4,] 4 3 15
[5,] 7 5 9
やりたいことは,
各行について,値を降順ソートして,
値そのものではなく,そのカラムのラベルで表示したいと思います。

出来上がりイメージは,以下です。
> mat2
第1位 第2位 第3位
[1,] "January" "February" "March"
[2,] "March" "January" "February"
[3,] "March" "January" "February"
[4,] "March" "January" "February"
[5,] "March" "January" "February"
まずは,ループを回すプログラムを作成しました。
label <- colnames(mat)
loop <- 1:nrow(mat)

mat2 <- mat
for(i in loop) {
v <- mat[i,]
mat2[i,] <- label[order(v, decreasing=TRUE)]
}

colnames(mat2) <- paste("第", 1:ncol(mat), "位", sep="")
mat2
apply()関数を使ってやりたいと思い,以下を作成しました。
mat2 <- apply(mat, 1, function(x) label[order(x, decreasing=TRUE)])
結果は,所望するものとはまったく違います。
> mat2
[,1] [,2] [,3] [,4] [,5]
[1,] "January" "March" "March" "March" "March"
[2,] "February" "January" "January" "January" "January"
[3,] "March" "February" "February" "February" "February"
私には,理解できないで困っております。
ご教示をいただければ大変に助かります。
お手数をおかけいたします。
//

No.22969 Re: 【R】apply()関数の使い方  【aoki】 2020/10/14(Wed) 23:02

apply() で返されるものが何なのかを確認してください
> apply(mat, 1, function(x) order(x, decreasing=TRUE))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 3 3 3
[2,] 2 1 1 1 1
[3,] 3 2 2 2 2
なので,求めるものを得るためには,
> label[apply(mat, 1, function(x) order(x, decreasing=TRUE))]
[1] "January" "February" "March"
[4] "March" "January" "February"
[7] "March" "January" "February"
[10] "March" "January" "February"
[13] "March" "January" "February"
としなければならないのです。
または,
> mat2 <- t(apply(mat, 1, function(x) label[order(x, decreasing=TRUE)]))
> mat2
[,1] [,2] [,3]
[1,] "January" "February" "March"
[2,] "March" "January" "February"
[3,] "March" "January" "February"
[4,] "March" "January" "February"
[5,] "March" "January" "February"
でもよいです。

No.22970 御礼(Re:【R】apply()関数の使い方)  【明石】 2020/10/15(Thu) 08:07

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
有り難いご教示をいただき,心から,心より感謝申し上げます。
ご丁寧にご説明をしてくださいましたので,よく理解できました。
誠にありがとうございました。
誠にありがとうございました。
//

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る