2011-09-21 7 views
56

Rで言うことができますか?位置iからすべてのインデックスをベクトル/行列の末尾にしたいですか? 3列目以降のサブマトリックスが必要です。私は現在、唯一この方法を知っている:ベクトル/行列の終わりまでエレガントなインデックス付け

A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix... 

A[,3:dim(A)[2]] # get submatrix from 3rd column onwards 

をしかし、私は本当に醜いdim(A)[2]を書くために必要なのですか?どのように "3列目以降"と言ってもエレガントな方法はありませんか?何かA[,3:]のようなもの? (またはA[,3:...])?

答えて

69

時には、あなたにを知らせないようにと言うのは、が必要な場合があります。言い換えれば、負のインデックスを使用して行列から列を除外する:

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 

だけにここで

は両方とも同じ結果を生成する2つの代替方法があります尋ねられたようにあなたの質問に答えてください: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 
+0

ヒント!ありがとう! alsa ncol(A)はdim(A)よりもはるかに短い[2]。ありがとう! – TMS

14

次いでhead()tail()を利用することができます。

A <- matrix(rep(1:8, each = 5), nrow = 5) 
tail(A, 3) 

(印刷rownames /インデックスが異なっているすべてである)ほぼ

A[3:dim(A)[1],] 

と同じです。あなたがtail()を適応させることができ、列バージョンの

> 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 

、が、それは少しトリッキーです:

あまりにもベクトルデータフレームのためのものな作業。 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 
+0

こんにちはGavin、 'tail'関数チップのおかげで。 – TMS

関連する問題