R Language
サブセッティング
サーチ…
前書き
Rオブジェクトが与えられている場合、そのオブジェクトに含まれるデータの1つ以上の部分について別個の分析が必要な場合があります。特定のオブジェクトからデータのこれらの部分を取得するプロセスは、 subsetting
と呼ばれます。
備考
値がありません:
欠損値( NA
とサブセットに使用S) [
リターンNA
のでNA
指数
未知の要素を選択するので、対応する要素にNAが返されます。
NA
の「デフォルト」タイプは、サブセット化に使用される「論理」ベクトルがサブセット化されたオブジェクトの長さに一致するようにリサイクルされることを意味する「論理」(タイプtypeof(NA)
)である。そうx[NA]
に相当するx[as.logical(NA)]
に相当するx[rep_len(as.logical(NA), length(x))]
と、これにより、欠落値を返す( NA
) x
各要素について。例として:
x <- 1:3
x[NA]
## [1] NA NA NA
「数字」/「整数」で索引付けしながら、 NA
、単一のピックNA
(各要素NA
インデックス内を):
x[as.integer(NA)]
## [1] NA
x[c(NA, 1, NA, NA)]
## [1] NA 1 NA NA
範囲外のサブセット:
[
1つの引数が渡された[
演算子]は、 > length(x)
インデックスを許可し、アトミックベクトルの場合はNA
、ジェネリックベクトルの場合はNULL
をNULL
。対照的に、 [[
場合と[
複数の引数が渡され(すなわち、範囲外のサブセットを用いてオブジェクトのlength(dim(x)) > 2
)エラーが返さです。
(1:3)[10]
## [1] NA
(1:3)[[10]]
## Error in (1:3)[[10]] : subscript out of bounds
as.matrix(1:3)[10]
## [1] NA
as.matrix(1:3)[, 10]
## Error in as.matrix(1:3)[, 10] : subscript out of bounds
list(1, 2, 3)[10]
## [[1]]
## NULL
list(1, 2, 3)[[10]]
## Error in list(1, 2, 3)[[10]] : subscript out of bounds
この動作は、オブジェクトの「名前」属性で一致しない「文字」ベクトルでサブセット化する場合も同じです。
c(a = 1, b = 2)["c"]
## <NA>
## NA
list(a = 1, b = 2)["c"]
## <NA>
## NULL
ヘルプトピックス:
詳細については、「 ?Extract
」を参照してください。
原子ベクトル
原子ベクトル(リストと式も除外しますが、これもベクトルです)は、 [
演算子:
# create an example vector
v1 <- c("a", "b", "c", "d")
# select the third element
v1[3]
## [1] "c"
[
演算子は引数としてベクトルをとることもできます。たとえば、最初と3番目の要素を選択するには:
v1 <- c("a", "b", "c", "d")
v1[c(1, 3)]
## [1] "a" "c"
時にはベクトルから特定の値を省略する必要がある場合もあります。これは、その値のインデックスの前にマイナス記号( -
)を使用して実現できます。たとえば、v1から最初の値を省略する場合は、 v1[-1]
使用します。これは、2つ以上の値に拡張することができます。たとえば、 v1[-c(1,3)]
ます。
> v1[-1]
[1] "b" "c" "d"
> v1[-c(1,3)]
[1] "b" "d"
場合によっては、特に、ベクトルの長さが長いときに特定の値のインデックスが存在する場合はそれを知りたいと思います。
> v1=="c"
[1] FALSE FALSE TRUE FALSE
> which(v1=="c")
[1] 3
アトミックベクトルに名前( names
属性)がある場合は、名前の文字ベクトルを使用してサブセットにすることができます。
v <- 1:3
names(v) <- c("one", "two", "three")
v
## one two three
## 1 2 3
v["two"]
## two
## 2
[[
演算子は、長さが1のインデックスベクトルを受け取り、存在する任意の名前を取り除くという点で、原子ベクトルをインデックス付けするためにも使用できます。
v[[c(1, 2)]]
## Error in v[[c(1, 2)]] :
## attempt to select more than one element in vectorIndex
v[["two"]]
## [1] 2
また、ベクトルは論理ベクトルを使用してサブセットにすることもできます。数値ベクトルと文字ベクトルによるサブセット化とは対照的に、サブセットに使用される論理ベクトルは、要素が抽出されるベクトルの長さと等しくなければならない。したがって、論理ベクトルy
がx
をサブセット化するために使用される場合、すなわちx[y]
length(y) < length(x)
y
はlength(x)
と一致するようにリサイクルされます:
v[c(TRUE, FALSE, TRUE)]
## one three
## 1 3
v[c(FALSE, TRUE)] # recycled to 'c(FALSE, TRUE, FALSE)'
## two
## 2
v[TRUE] # recycled to 'c(TRUE, TRUE, TRUE)'
## one two three
## 1 2 3
v[FALSE] # handy to discard elements but save the vector's type and basic structure
## named integer(0)
リスト
リストは[
:
l1 <- list(c(1, 2, 3), 'two' = c("a", "b", "c"), list(10, 20))
l1
## [[1]]
## [1] 1 2 3
##
## $two
## [1] "a" "b" "c"
##
## [[3]]
## [[3]][[1]]
## [1] 10
##
## [[3]][[2]]
## [1] 20
l1[1]
## [[1]]
## [1] 1 2 3
l1['two']
## $two
## [1] "a" "b" "c"
l1[[2]]
## [1] "a" "b" "c"
l1[['two']]
## [1] "a" "b" "c"
[
演算子はリストの要素を選択してより小さなリストを返すので、 l1[2]
の結果は依然としてリストであることに注意してください。 [[
演算子はリスト要素を抽出し、リスト要素の型のオブジェクトを返します。
要素は、番号または名前の文字列で索引付けできます(存在する場合)。複数の要素は、 [
数値の文字列や名前の文字列を渡すことで[
で選択することができます。ベクトルと割出しlength > 1
で[
および[[
、それぞれ 、指定された要素と再帰サブセット(可能な場合)で「リスト」を返します。
l1[c(3, 1)]
## [[1]]
## [[1]][[1]]
## [1] 10
##
## [[1]][[2]]
## [1] 20
##
##
## [[2]]
## [1] 1 2 3
に比べ:
l1[[c(3, 1)]]
## [1] 10
これは以下と同等です:
l1[[3]][[1]]
## [1] 10
$
演算子を使用すると、名前だけでリスト要素を選択できますが、 [
と[[
、引用符は必要ありません。中置演算子として、 $
は1つの名前しか取ることができません:
l1$two
## [1] "a" "b" "c"
また、 $
演算子はデフォルトで部分一致を可能にします:
l1$t
## [1] "a" "b" "c"
部分一致が許可されるかどうかを指定する必要がある場合[[
l1[["t"]]
## NULL
l1[["t", exact = FALSE]]
## [1] "a" "b" "c"
options(warnPartialMatchDollar = TRUE)
設定options(warnPartialMatchDollar = TRUE)
、部分一致が$
起こったときに "警告"が与えられます:
l1$t
## [1] "a" "b" "c"
## Warning message:
## In l1$t : partial match of 't' to 'two'
行列
オブジェクトの各次元について、 [
演算子は1つの引数をとります。ベクトルは次元が1つあり、引数は1つです。行列とデータフレームは2つの次元を持ち、 [i, j]
として与えられる2つの引数を取る[i, j]
ここで、 i
は行であり、 j
は列である。インデックスは1から始まります。
## a sample matrix
mat <- matrix(1:6, nrow = 2, dimnames = list(c("row1", "row2"), c("col1", "col2", "col3")))
mat
# col1 col2 col3
# row1 1 3 5
# row2 2 4 6
mat[i,j]
は、行列mat
のi
番目のj
番目の列の要素です。たとえば、 i
値が2
でj
値が1
場合は、行列の2番目の行と1番目の列の番号が与えられます。 i
またはj
を省略すると、その次元のすべての値が返されます。
mat[ , 3]
## row1 row2
## 5 6
mat[1, ]
# col1 col2 col3
# 1 3 5
行列に行または列の名前(必須ではない)がある場合は、これらをサブセット化に使用できます。
mat[ , 'col1']
# row1 row2
# 1 2
デフォルトでは、サブセットの結果は可能な限り単純化されます。上記の例のようにサブセットに次元が1つしかない場合、結果は2次元の行列ではなく1次元のベクトルになります。このデフォルトは、 drop = FALSE
引数で[
:
## This selects the first row as a vector
class(mat[1, ])
# [1] "integer"
## Whereas this selects the first row as a 1x3 matrix:
class(mat[1, , drop = F])
# [1] "matrix"
もちろん、選択自体に2つのディメンションがある場合、ディメンションを削除することはできません。
mat[1:2, 2:3] ## A 2x2 matrix
# col2 col3
# row1 3 5
# row2 4 6
それらの位置によって個々のマトリクスエントリを選択する
Nx2マトリックスを使用して、マトリックスからN個の個々の要素を選択することもできます(座標系の仕組みなど)。ベクトル(1st row, 1st column), (1st row, 3rd column), (2nd row, 3rd column), (2nd row, 1st column)
行列のエントリをベクトルで抽出する場合は、これらの座標でインデックス行列を作成し、それを使って行列をサブセット化することで簡単に行えます:
mat
# col1 col2 col3
# row1 1 3 5
# row2 2 4 6
ind = rbind(c(1, 1), c(1, 3), c(2, 3), c(2, 1))
ind
# [,1] [,2]
# [1,] 1 1
# [2,] 1 3
# [3,] 2 3
# [4,] 2 1
mat[ind]
# [1] 1 5 6 2
上の例では、 ind
行列の1列目はmat
行を参照し、2列目のind
はmat
列を参照します。
データフレーム
より小さなデータフレームにデータフレームをサブセット化することは、リストをサブセット化することと同じように達成することができる。
> df3 <- data.frame(x = 1:3, y = c("a", "b", "c"), stringsAsFactors = FALSE)
> df3
## x y
## 1 1 a
## 2 2 b
## 3 3 c
> df3[1] # Subset a variable by number
## x
## 1 1
## 2 2
## 3 3
> df3["x"] # Subset a variable by name
## x
## 1 1
## 2 2
## 3 3
> is.data.frame(df3[1])
## TRUE
> is.list(df3[1])
## TRUE
データフレームを列ベクトルにサブセット化するには、二重括弧[[]]またはドル記号演算子$を使用します。
> df3[[2]] # Subset a variable by number using [[ ]]
## [1] "a" "b" "c"
> df3[["y"]] # Subset a variable by name using [[ ]]
## [1] "a" "b" "c"
> df3$x # Subset a variable by name using $
## [1] 1 2 3
> typeof(df3$x)
## "integer"
> is.vector(df3$x)
## TRUE
データを2次元行列としてサブセット化することは、 i
およびj
項を使用して達成することができる。
> df3[1, 2] # Subset row and column by number
## [1] "a"
> df3[1, "y"] # Subset row by number and column by name
## [1] "a"
> df3[2, ] # Subset entire row by number
## x y
## 2 2 b
> df3[ , 1] # Subset all first variables
## [1] 1 2 3
> df3[ , 1, drop = FALSE]
## x
## 1 1
## 2 2
## 3 3
注意: j
(列)によるサブセット化だけで、変数の型に単純化されますが、 i
だけでサブセット化するとdata.frame
が返されます。異なる変数は異なる型とクラスを持つ可能性があります。 drop
パラメータをFALSE
設定すると、データフレームが保持されFALSE
。
> is.vector(df3[, 2])
## TRUE
> is.data.frame(df3[2, ])
## TRUE
> is.data.frame(df3[, 2, drop = FALSE])
## TRUE
その他のオブジェクト
[
と[[
演算子は一般的なプリミティブ関数です。これは、R内のオブジェクト (特にisTRUE(is.object(x))
ieが明示的な "class"属性を持つ)が、サブセット化されたときにそれ自身の指定された振る舞いを持つことができることを意味します。すなわちのための独自のメソッドを持っている[
および/または[[
例えば、これは[.data.frame
( is.object(iris)
)オブジェクトの場合で、 [.data.frame
と[[.data.frame
メソッドが定義されていて、それらが両方とも "matrix"のように表示される「リスト」のようなサブセッティングが含まれます。 「data.frame」をサブセット化、我々がいることがわかり、エラーを強制すると、実際には、機能[.data.frame
、我々が使用-just-ときに呼び出された[
。
iris[invalidArgument, ]
## Error in `[.data.frame`(iris, invalidArgument, ) :
## object 'invalidArgument' not found
現在のトピックに関する詳細な説明がない限り、例[
メソッド:
x = structure(1:5, class = "myClass")
x[c(3, 2, 4)]
## [1] 3 2 4
'[.myClass' = function(x, i) cat(sprintf("We'd expect '%s[%s]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour\n", deparse(substitute(x)), deparse(substitute(i))))
x[c(3, 2, 4)]
## We'd expect 'x[c(3, 2, 4)]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour
## NULL
私たちは、 [
generic以外の等価な.subset
(と[[
.subset2
)を使用することで、 [
ディスパッチ方法を克服することができます。これは、私たち自身の "クラス"をプログラミングするとき、そして "クラス"を効率的に(メソッドのディスパッチとオブジェクトのコピーを避けて)計算するときの回避策( unclass(x)
)を避けたいときに特に有効で効率的です。
.subset(x, c(3, 2, 4))
## [1] 3 2 4
ベクトル索引付け
この例では、次のベクトルを使用します。
> x <- 11:20
> x
[1] 11 12 13 14 15 16 17 18 19 20
Rベクトルは1つのインデックスが付けられているので、例えばx[1]
は11
を返します。また、添え字ベクトルをブラケット演算子に渡すことで、 x
サブベクトルを抽出することもできます。
> x[c(2,4,6)]
[1] 12 14 16
負のインデックスのベクトルを渡すと、指定されたインデックスが除外されたサブベクトルが返されます。
> x[c(-1,-3)]
[1] 12 14 15 16 17 18 19 20
ブール演算子にブール値ベクトルを渡すこともできます。この場合、インデックスベクトルがTRUE
座標に対応するサブベクトルが返されます。
> x[c(rep(TRUE,5),rep(FALSE,5))]
[1] 11 12 13 14 15 16
インデックスベクトルが配列の長さよりも短い場合は、次のように繰り返されます。
> x[c(TRUE,FALSE)]
[1] 11 13 15 17 19
> x[c(TRUE,FALSE,FALSE)]
[1] 11 14 17 20
要素単位の行列演算
AとBを同じ次元の2つの行列とする。演算子+
、 -
、 /
、 *
、 ^
は、同じ次元の行列と一緒に使用すると、行列の対応する要素に対して必要な演算を実行し、同じ次元の新しい行列を返します。これらの操作は、通常、要素ごとの操作と呼ばれます。
オペレーター | オペラB | 意味 |
---|---|---|
+ | A + B | AとBの対応する要素の追加 |
- | A - B | Bの要素をAの対応する要素から引きます |
/ | A / B | Aの要素をBの対応する要素で除算します。 |
* | A * B | Aの要素にBの対応する要素を乗算します。 |
^ | A ^( - 1) | 例えば、要素がAの逆数である行列を与える |
線形代数に見られるように、 "真の"行列乗法の場合、 %*%
使用します。たとえば、AとBの乗算は、 A %*% B
です。寸法要件があることncol()
のと同じであるA
nrow()
のB
行列で使用される関数
関数 | 例 | 目的 |
---|---|---|
nrow() | ネロー(A) | Aの行数を決定する |
ncol() | ncol(A) | Aの列数を決定する |
rownames() | rownames(A) | 行列Aの行名を出力します。 |
colnames() | colnames(A) | 行列Aの列名を出力します。 |
rowMeans() | rowMeans(A) | 行列Aの各行の手段を計算する |
colMeans() | colMeans(A) | 行列Aの各列の手段を計算する |
upper.tri() | upper.tri(A) | 要素が上部であるベクトルを返します |
正方行列Aの三角行列 | ||
lower.tri() | lower.tri(A) | 要素が下位のベクトルを返します。 |
正方行列Aの三角行列 | ||
det() | det(A) | 結果として行列Aの行列式が得られる |
解決する() | 解決する(A) | 非特異的行列Aの逆行列が得られる |
diag() | ダイアグ(A) | 対角行列を返します。その対角行列は、診断外要素がゼロであり、 |
対角線は正方行列Aの対角線と同じである | ||
t() | t(A) | 行列Aの転置を返します |
固有値() | 固有値(A) | 行列Aの固有値と固有ベクトルを復元する |
is.matrix() | is.matrix(A) | Aが行列かどうかによってTRUEまたはFALSEを返します。 |
as.matrix() | as.matrix(x) | ベクトルxから行列を作成する |