裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:何がやりたいのかを簡明直裁に書こう

2013年01月08日 | ブログラミング

MeanDecreaseGiniが大きい変数の箱ひげ図を描く」の記事についてだけど...

ベクトル要素の大きい順に 1, 2, ... と順序づけを行いたかったときに,「order 関数を二重に使えばよい」と twitter で教えてもらったということのようだ。

> x <- c(5,2,1,6,4,7,9,3,8)
> order(order(x, decreasing = T))
[1] 5 8 9 4 6 3 1 7 2

この問題をすなおに解こうとすると,「順位付け」というキーワードが浮かぶだろう。「ランク付け」ですね。そして,文字通り rank という関数があるんです。

? order をやると,See Also の所に, sort, rank, xtfm の 3 つが挙げてある。rank 関数は,同順位をどのように処理するかも指定できる。

で,やってみると(やってみなくてもわかるが)

> rank(x)
[1] 5 2 1 6 4 7 9 3 8

おや,結果が違う。それは,小さい順に順位付けされるから。では,大きい順に順位付けしたいためには?

ベクトル要素の符号が混じっていないなら(正の要素ばかりとか負の要素ばかりとか),マイナスをつける。

> rank(-x)
[1] 5 8 9 4 6 3 1 7 2

ほらできた。

しかしですね,ここで喜んではいけない。

筆者は,rk を求めて,最終的に n6 を得るためになにか不思議なことをやっている。

要素の値が大きい順にその要素の番号を取り出そうというのだから,そんな大変なわけがない。というか,order 関数の戻り値そのままじゃぁないの?

ということで,1 行で書けて,結果は同じだった。ということは,筆者は他人にわかりにくい,無駄なことをやったということか。

> rk <- order(order(rf.model$importance, decreasing = TRUE))
> n <- seq(1, nc2, 1)
> n2 <- cbind(rk, n)
> n3 <- data.frame(rk = n2[, 1], n = n2[, 2])
> n4 <- n3[order(n3$rk), ]
> n5 <- n4$n
> n6 <- n5[1:x]
> n6
[1] 52 53  7 16 55 56 21 25 57

> n6 <- order(rf.model$importance, decreasing = TRUE)[1:x]
> n6
[1] 52 53  7 16 55 56 21 25 57   同じだ

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村