Linuxコマンドを利用したデータ加工に慣れていると、Rでも"uniq -c"をしたくなる。
“uniq -c"とは、重複を取り除きつつそれぞれの要素がいくつかあるのかカウントするコマンドで、要は度数分布を集計する。
度数分布を出すにはいくつか方法があると思うけれど、ここでは"uniq -c"のような雰囲気の関数rle()を利用してみる。
まず、関数rle()のヘルプに記載されている使用例を実行する。
x <- rev(rep(6:10, 1:5))
x
## [1] 10 10 10 10 10 9 9 9 9 8 8 8 7 7 6
6が1つ、7が2つ、…、10が5つのベクトルデータを作成し、rev()で逆順としている。
このベクトルに関数rle()を実行する。
d <- rle(x)
d
## Run Length Encoding
## lengths: int [1:5] 5 4 3 2 1
## values : int [1:5] 10 9 8 7 6
すると、要素のカウントがlengthというベクトルに、それと対応する要素名がvaluesというベクトルに格納される。ベクトルなので以下のような操作が可能。
d$length # ベクトルlengthを表示
## [1] 5 4 3 2 1
d$values[1] # ベクトルvalueの先頭の要素を表示
## [1] 10
ヘルプには論理値TRUE,FALSEのベクトルを用いた使用例もある。
z <- c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE)
rle(z)
## Run Length Encoding
## lengths: int [1:5] 2 2 1 1 3
## values : logi [1:5] TRUE FALSE TRUE FALSE TRUE
結果を見ると、結局TRUEとFALSEがそれぞれいくつなのかわかりづらい。
"uniq -c"コマンド同様、ベクトルのソートが必要なのだろう。
rle(sort(z, decreasing = TRUE)) # zをソートしてからrle。TRUEがFALSEよりも前に来るように降順指定
## Run Length Encoding
## lengths: int [1:2] 6 3
## values : logi [1:2] TRUE FALSE
というわけで、ソートする必要があると。
それにしてもrleってのはわかりにくい名前だ。線形回帰などを想起してしまう。