情報科学と人工知能のノート

初等的な知識から最新論文の解説まで色々集めていきます.備忘録兼用.

R 備忘録 2013/05/11

今日は短めです。

ベクトルの要素のうち条件を満たすもののインデクスを集める

ということが which 関数を使うと実現できます。

> a <- seq(1, 30, 3)
> a
[1] 1 4 7 10 13 16 19 22 25 28
> which(a %% 2 == 0) # 偶数
[1] 2 4 6 8 10

> which(max(a) == a)
[1] 10

この which(max(a) == a) が初見時にとても不思議な文に見えたのですが、which の中身だけを評価してみると仕組みがよくわかりました。

> max(a) == a
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE

要するに、TRUE のインデクスを集めてきて返すだけみたいですね。

なお、行列に対して使用しても

> b <- matrix(1:8, 2, 4)
> b
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> b %% 2 == 0
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE TRUE TRUE TRUE
> which(b %% 2 == 0)
[1] 2 4 6 8

となり、ベクトルとしてのインデクスを返すようです。

要素のソート・ランキング

sort 関数を使うとベクトルの要素を(デフォルトでは)昇順に並べ替えることができます。
また、order 関数を使うとベクトルの要素が昇順となるインデクスの順序を求めることができます。

> c <- runif(10)
> c
[1] 0.82190691 0.98909512 0.05540597 0.23543929 0.63394228 0.87780395
[7] 0.55227800 0.20187754 0.05960969 0.98804746
> sort(c)
[1] 0.05540597 0.05960969 0.20187754 0.23543929 0.55227800 0.63394228
[7] 0.82190691 0.87780395 0.98804746 0.98909512
> order(c)
[1] 3 9 8 4 7 5 1 6 10 2

なお、降順にするには decreasing を TRUE にします。

> sort(c, decreasing=TRUE)
[1] 0.98909512 0.98804746 0.87780395 0.82190691 0.63394228 0.55227800
[7] 0.23543929 0.20187754 0.05960969 0.05540597
> order(c, decreasing=TRUE)
[1] 2 10 6 1 5 7 4 8 9 3