Rで言うことは可能ですか?位置i
からベクトル/行列の最後までのすべてのインデックスが必要ですか? 3列目以降の部分行列が必要だとします。私は現在この方法しか知りません:
_A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix...
A[,3:ncol(A)] # get submatrix from 3rd column onwards
_
しかし、本当にncol(A)
を書く必要がありますか? 「第3列以降」と言うエレガントな方法はありませんか? _A[,3:]
_のようなものですか? (または_A[,3:...]
_)?
時々、Rにdo n'tが欲しいものを伝える方が簡単です。つまり、負のインデックス付けを使用してマトリックスから列を除外します。
両方が同じ結果を生成する2つの代替方法を次に示します。
A[, -(1:2)]
A[, -seq_len(2)]
結果:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 4 5 6 7 8
[2,] 3 4 5 6 7 8
[3,] 3 4 5 6 7 8
[4,] 3 4 5 6 7 8
[5,] 3 4 5 6 7 8
しかし、質問に答えるには:ncol
を使用して列の数を見つけます。 (同様に、行数を見つけるためのnrow
があります。)
A[, 3:ncol(A)]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 4 5 6 7 8
[2,] 3 4 5 6 7 8
[3,] 3 4 5 6 7 8
[4,] 3 4 5 6 7 8
[5,] 3 4 5 6 7 8
行(例のように列ではない)の場合、head()
およびtail()
を使用できます。
_A <- matrix(rep(1:8, each = 5), nrow = 5)
tail(A, 3)
_
とほぼ同じです
_A[3:dim(A)[1],]
_
(印刷される行名/インデックスは異なります)。
これらはベクトルとデータフレームでも機能します。
_> tail(1:10, 4)
[1] 7 8 9 10
> tail(data.frame(A = 1:5, B = 1:5), 3)
A B
3 3 3
4 4 4
5 5 5
_
列バージョンの場合、tail()
を適応できますが、少し複雑です。ここでは、NROW()
ではなく、NCOL()
とdim()
が役立つのではないかと思います。
_> A[, 3:NCOL(A)]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 4 5 6 7 8
[2,] 3 4 5 6 7 8
[3,] 3 4 5 6 7 8
[4,] 3 4 5 6 7 8
[5,] 3 4 5 6 7 8
_
または、これを頭の上でひっくり返し、Rに物事を尋ねる代わりに、物を落とすように頼みます。これをカプセル化する関数は次のとおりです。
_give <- function(x, i, dimen = 1L) {
ind <- seq_len(i-1)
if(isTRUE(all.equal(dimen, 1L))) { ## rows
out <- x[-ind, ]
} else if(isTRUE(all.equal(dimen, 2L))) { ## cols
out <- x[, -ind]
} else {
stop("Only for 2d objects")
}
out
}
> give(A, 3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 3 4 5 6 7 8
[2,] 1 2 3 4 5 6 7 8
[3,] 1 2 3 4 5 6 7 8
> give(A, 3, dimen = 2)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 4 5 6 7 8
[2,] 3 4 5 6 7 8
[3,] 3 4 5 6 7 8
[4,] 3 4 5 6 7 8
[5,] 3 4 5 6 7 8
_
次の指示を使用できます。
A[, 3:length(A[, 1])]