2011-09-21 4 views
56

क्या आर में यह संभव है - मैं सभी सूचकांक i सेक्टर/मैट्रिक्स के अंत तक चाहता हूं? कहें कि मैं तीसरे कॉलम से एक सबमिट्रिक्स चाहता हूं। मैं वर्तमान में केवल इस तरह से जानते हैं:वेक्टर/मैट्रिक्स के अंत तक सुरुचिपूर्ण इंडेक्सिंग

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] लिखने के लिए की जरूरत है? क्या "तीसरे कॉलम से आगे" कहने का कोई सुरुचिपूर्ण तरीका नहीं है? 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 

लेकिन करने के लिए

यहाँ दो वैकल्पिक तरीकों कि दोनों का उत्पादन एक ही परिणाम हैं: दूसरे शब्दों में, नकारात्मक अनुक्रमण का उपयोग कर मैट्रिक्स से कॉलम को बाहर पूछे गए प्रश्न के उत्तर दें: कॉलम की संख्या खोजने के लिए 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) 'वास्तव में अच्छा लग रहा है ... अल्सा नॉक (ए) मंद (ए) [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 

या अपने सिर पर इस फ्लिप और इसके बजाय बातों के लिए आर पूछने का, बजाय बातें छोड़ने के लिए यह पूछना। यहां एक फ़ंक्शन है जो इसे समाहित करता है:

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