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:ncol(A)] # get submatrix from 3rd column onwards
Mais ai-je vraiment besoin d'écrire ncol(A)
? 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:...]
)?
Parfois, il est plus facile de dire à R ce que vous ne pas voulez. En d'autres termes, excluez les colonnes de la matrice à l'aide de l'indexation négative:
Voici deux manières alternatives qui produisent 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, posez les questions suivantes: utilisez ncol
pour trouver le nombre de colonnes. (De même, il existe 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
Pour les lignes (pas les colonnes selon votre exemple), alors head()
et tail()
pourraient être utilisés.
A <- matrix(rep(1:8, each = 5), nrow = 5)
tail(A, 3)
est presque le même que
A[3:dim(A)[1],]
(les noms de domaine/index imprimés sont différents, c’est tout).
Ceux qui travaillent pour les vecteurs et les cadres de données aussi:
> 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 les versions de colonne, vous pouvez adapter tail()
, mais c'est un peu plus compliqué. Je me demande si NROW()
et NCOL()
pourraient être utiles ici, plutôt que 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 inversez-le et au lieu de demander des choses à R, demandez-lui de laisser tomber des choses. Voici une fonction qui encapsule ceci:
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
Vous pouvez utiliser l'instruction suivante:
A[, 3:length(A[, 1])]