2011-09-19 4 views
3

J'ai une boucle for, qui me renvoie les valeurs d'une dataframe en utilisant which, which.min et which.max qui me donne les "coordonnées". Voici un exempleSélection de plusieurs valeurs à partir d'une matrice de données avec des indices

df <- as.data.frame(matrix(rnorm(11284), nrow=403, ncol=28)) 
row <- matrix(data=c(1:403),nrow=403, ncol=1) 
col <- matrix(rnorm(403,14,3), nrow=403, ncol=1) 
col <- round(col, 0) 
coord <- cbind(row, col) 

Coord conserve les coordonnées pour un critère que j'ai défini précédemment. Je veux maintenant extraire les valeurs respectives selon les coordonnées de df avec une boucle

for (i in 1:nrow(coord)) { 
print(df[coord[i,1], coord[i,2]]) 
} 

Lorsque j'utilise

output <- df[coord[i,1], coord[i,2]]) 

il me donne seulement la dernière expression de la boucle. Ma question simple est maintenant: Comment est-ce que je stocke non seulement la dernière expression de cette boucle, mais le vecteur entier qui me est donné par l'impression?

+0

Bienvenue sur SO. J'ai changé le titre pour quelque chose qui représente mieux votre problème. Si vous n'êtes pas d'accord, n'hésitez pas à revenir en arrière. Voir aussi la [FAQ] (http://stackoverflow.com/faq). –

Répondre

3

Vous êtes surpris? Vous stockez chaque boucle seulement cette valeur de la sortie en boucle. Donc, après la dernière boucle, c'est seulement la dernière valeur. La solution de boucle correcte serait:

output <- vector(length=nrow(coord)) 
for (i in 1:nrow(coord)){ 
    output[i] <- df[coord[i,1],coord[i,2]] 
} 

Mais vous n'avez pas besoin d'utiliser une boucle. Étant donné que vous avez les coordonnées dans une trame de données ou d'une matrice, cela peut être fait de toute façon plus simple tout beaucoup:

output <- Df[coord] 

Pas de boucle nécessaire.

0

Cela ressemble un peu à OP utilisé SAS auparavant, dans les variables R n'ont pas d'historique. Au lieu de l'opération ligne par ligne dans R, essayez d'effectuer un calcul vectoriel et utilisez apply pour appliquer une fonction à chaque entrée d'un vecteur ou d'une matrice. Dans des cas plus conditionnels, vous pouvez utiliser une boucle for et stocker les valeurs de retour sous forme d'entrées, puis les retourner ou les imprimer en une seule fois:

my <- function() { 
    outputs <- rep(0,20) 
    for(i in 1:20) { 
     outputs[i] <- i*i 
    } 
return(outputs) 
} 
Questions connexes