77 votes

Indexation élégante jusqu'à la fin du vecteur / matrice

Est-il possible dans R de dire - je veux tous les indices de la position i à la fin du vecteur / matrice? Dites que je veux une sous-matrice à partir de la 3ème colonne. Je ne connais actuellement que cette façon:

 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
 

Mais ai-je vraiment besoin d'écrire cet horrible dim(A)[2] ? N'y a-t-il pas une manière élégante de dire "à partir de la 3ème colonne"? Quelque chose comme A[,3:] ? (ou A[,3:...] )?

104voto

Andrie Points 66979

Il est parfois plus facile à dire R ce que vous ne voulez. En d'autres termes, d'en exclure les colonnes de la matrice en utilisant la négative indexation:

Voici deux autres façons d'obtenir les mêmes résultats:

A[, -(1:2)]
A[, -seq_len(2)]

Résultats:

     [,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

Mais pour répondre à votre question, comme demandé: Utiliser ncol pour trouver le nombre de colonnes. (De même, il est nrow pour trouver le nombre de lignes.)

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

17voto

Gavin Simpson Points 72349

Pour les lignes (pas de colonnes que par votre exemple), alors head() et tail() pourraient être utilisées.

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

est presque le même que

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

(le rownames/indices imprimés sont différentes c'est tout).

Ceux qui travaillent pour les vecteurs et les trames de données trop:

> 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

Pour la colonne versions, vous pourriez adapter tail(), mais il est un peu plus compliqué. Je me demande si NROW() et NCOL() pourrait être utile ici, plutôt que d' 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

Ou flip-ce sur sa tête et au lieu de lui demander de R les choses, de lui demander de déposer des choses à la place. Voici une fonction qui encapsule ce:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X