R: sort、order、不等号を用いた要素の抽出

sortとorderは、いずれも並び替え関数ですが、微妙に使い方が異なります。通常はorderを利用するのが無難そうです。

数値、文字、日付、NAから構成される配列zを作成します。class関数で確認すると、zはcharacterに設定されています。

> z <- c(1, 2, "a", "1999-04-04", 19, 20, 45, NA, "ABC", "1999-04-03") > class(z)
[1] "character"
 

sort(, na.last=NA, decreasing=FALSE)

sort(z)では、数値→文字(大→小文字)の順番に並べかえられます。したがって、z[sort(z)]は全く機能しません。また、デフォルト設定ではNAが除外されます(na.last=NA)。

> z
[1] "1" "2" "a" "1999-04-04" "19" "20" "45" NA "ABC" "1999-04-03"
> sort(z)
[1] "1" "19" "1999-04-03" "1999-04-04" "2" "20" "45" "ABC" "a"
> z[sort(z)]
[1] NA NA NA NA NA NA NA NA NA
 

NAを含めるためには、na.last=TRUEを設定します。

> z
[1] "1" "2" "a" "1999-04-04" "19" "20" "45" NA "ABC" "1999-04-03"
> sort(z, na.last=TRUE)
[1] "1" "19" "1999-04-03" "1999-04-04" "2" "20" "45" "ABC" "a" NA
 

降順に並べ替えるには, decreasing=TRUEを設定します。

> z
[1] "1" "2" "a" "1999-04-04" "19" "20" "45" NA "ABC" "1999-04-03"
> sort(z, decreasing=TRUE)
[1] "a" "ABC" "45" "20" "2" "1999-04-04" "1999-04-03" "19" "1"
 

order(, na.last=TRUE, decreassing=FALSE)

order(z)では添字が出力されますので、z[order(z)]は思い通りに機能します。

なお、デフォルト設定(na.last=NA)ではNAは除外されません。

> z
[1] "1" "2" "a" "1999-04-04" "19" "20" "45" NA "ABC" "1999-04-03"
> order(z)
[1] 1 5 10 4 2 6 7 9 3 8
> z[order(z)]
[1] "1" "19" "1999-04-03" "1999-04-04" "2" "20" "45" "ABC" "a" NA
 

不等号を用いた条件に一致する要素を抽出する

z <= 2 あるい z < 2 を満たす要素を抽出しようとすると、NAも抽出されています。

> z[z<=2] [1] "1" "2" "1999-04-04" "19" NA "1999-04-03" > z[z>2]
[1] "a" "20" "45" NA "ABC"
 

NAも除外するならば、is.na(z)を追記しなければなりません。

> z[z>=2 & !is.na(z)]
[1] "1" "2" "1999-04-04" "19" "1999-04-03"