2012-03-11 3 views
0

La question est la même que here, mais dans R. J'ai une matrice et un vecteur tel queSélectionnez un élément de chaque rangée d'une matrice en R

length(vec) == nrow(mat) 

Comment obtenir un vecteur i tel que

v[i] == mat[v[i],i] 

J'ai essayé de le faire en utilisant la matrice logique:

>a = matrix(runif(12),4,3) 
a 
      [,1]  [,2]  [,3] 
[1,] 0.6077585 0.5354680 0.2802681 
[2,] 0.2596180 0.6358106 0.9336301 
[3,] 0.5317069 0.4981082 0.8668405 
[4,] 0.6150885 0.5164009 0.5797668 
> sel = col(a) == c(1,3,2,1) 
> sel 
     [,1] [,2] [,3] 
[1,] TRUE FALSE FALSE 
[2,] FALSE FALSE TRUE 
[3,] FALSE TRUE FALSE 
[4,] TRUE FALSE FALSE 
> a[sel] 
[1] 0.6077585 0.6150885 0.4981082 0.9336301 

Il sélectionne élémen droite ts mais bousille l'ordre. J'ai pensé à utiliser mapply non plus, mais je ne sais pas comment le faire itérer à travers les lignes, comme dans apply.

upd: @ gsk3 a suggéré d'utiliser as.list(as.data.frame(t(a))) cela fonctionne. Mais encore je voudrais savoir s'il y a une manière plus vectorisée, sans listes.

+1

Utilisation mapply en faisant aa liste des vecteurs: as.list (as.data.frame (a)) –

+0

Cette aide, à l'exception des lignes que vous devriez faire as.list (as.data.frame (t (a))), merci! –

Répondre

3

Je ne suis pas sûr à 100% que je comprends votre question, mais il semble que ce soit proche?

> b=c(1,3,2,1) 

> i=cbind(1:nrow(a),b) 

> a[i] 
+0

C'est exactement ce que je cherchais! Merci Monsieur! –

Questions connexes