web-dev-qa-db-ja.com

ベクトル/マトリックスの最後までのエレガントなインデックス作成

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:...]_)?

65
TMS

時々、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
86
Andrie

行(例のように列ではない)の場合、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
_
16
Gavin Simpson

次の指示を使用できます。

A[, 3:length(A[, 1])]
1
Reza Sadeghi