2011-09-21 19 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

有時候更容易告訴R你不要想要的。

下面是既產生相同的結果兩種可選的方式:

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 
+0

好的提示!謝謝! ' - (1:2)'看起來很酷...... alsa ncol(A)比dim(A)[2]短得多。謝謝! – TMS

14

對於行(未按您的例子列)然後head()tail()可以利用。

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

是幾乎相同

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

(所述rownames /印刷指數是不同的是全部)。

的載體和數據的那些工作幀太:

> 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 
+0

嗨加文,感謝'尾巴'功能提示。 – TMS