niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) R言語徹底解説 3章 手を動かす編2

一旦3章に戻る。

3.2.3の、演算子[と[[によるアトミックベクトルとリストへの結果の違いについての表の結果が気になったので書いておく。

行列は3.2.3の表とは関係ないですが、自分の知識の補強として。

maxtrixはベクトルにdimの属性がついただけなので、

x <- matrix(1:9, nrow=3)
x
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9

x[1]
# [1] 1

のようにアクセスするとmatrixの左上から下方向に順にアクセスできる。 そのため、byrow=Tを指定すればこんな感じ。

x <- matrix(1:9, nrow=3,byrow = T)
x
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    4    5    6
# [3,]    7    8    9
x[2]
# [1] 4

同じインデックスでも返ってくる値は異なる(当たり前だが)

x <- matrix(1:9, nrow=3,byrow = F)
x[2]
# [1] 2

このとき、範囲外の値を与えるとNAが返ってくる

x[10]
# [1] NA

ベクトルなので、logicalを与えるとリサイクル規則で展開される。NAはlogicalなので

x[NA]
# [1] NA NA NA NA NA NA NA NA NA

当然、TRUEなら全要素

x[T]
# [1] 1 2 3 4 5 6 7 8 9

逆にFALSEだと

x[F]
# integer(0)

となる。一致する要素がないため。これは、NULLを与えたときと返ってくる値は同じ。

x[NULL]
# integer(0)

NA_real_で与えてあげれば、当然1要素だけとなる。logicalではないので。

x[NA_real_]
# [1] NA

ちょっとこの辺りの値は書いてある結果と違う気がしますね。誤植かも。
[[のほうは同じで全部エラーとなります。

listの場合、

(y <- list(a=1, b=2, c=3))
# 
# $a
# [1] 1
# 
# $b
# [1] 2
# 
# $c
# [1] 3

として、

y[NA]
# $<NA>
# NULL
# 
# $<NA>
# NULL
# 
# $<NA>
# NULL

y[NA_real_]
# $<NA>
# NULL

y[NULL]
# named list()

y[[NA]]
# NULL
y[[NA_real_]]
# NULL

こんな結果に。エラーについては同じ結果でした。

まぁ、これを積極的に使うことはないと思いますが、変な結果が出たときに何が原因かピンと来るためには変な値を与えた結果を見ておくと良いのです(たぶん)

そんな感じで今回はここまで。

listをas.data.frameにしたときの挙動がちょっと不思議だったので宿題としてそれが残っていますが、6章も進めていきます…。

Enjoy!!