2017-08-28 1 views
2

Supposons que j'ai une simple listeLooping/impression sur une liste R

v <- list(vec1=c(1,2,3), vec2=c(3,4,5, 6)) 

Je voudrais faire une boucle sur cette liste et exécuter certaines fonctions sur son élément, de sorte que comme une sortie que je reçois à la fois: nom de cet élément particulier et sortie de la fonction. Par exemple:

for (i in v) 
{print(sd(i)) 
} 

Dans ce cas, la sortie est:

[1] 1 
[1] 1.290994 

Mais je voudrais voir quelque chose comme ceci:

$vec1 
[1] 1 
$vec2 
[1] 1.290994 

Alors que je peux facilement repérer à qui élément chaque sortie se réfère, si j'ai plusieurs éléments dans ma liste. Je sais qu'il a sth avec la fonction names() à faire, mais je ne peux pas le faire fonctionner.

+8

'lapply (v, sd)' –

+0

Merci, cela fonctionne très bien! Cependant, y at-il un moyen de le faire avec une sorte de boucle ou de modifier lapply(), car en fait j'ai des exemples plus compliqués? Par exemple, une liste de trames de données, sur laquelle je voudrais exécuter une matrice de corrélation de colonnes particulières? – Yaahtzeck

Répondre

1

Utilisation de la fonction names() et sortir une liste:

result<-list() 
for (i in 1:length(v)) 
{result[[i]]=sd(v[[i]]) 
} 
names(result)<-names(v) 

L'inconvénient de cette méthode est qu'il attribuera les noms erronés si la liste résultante est inférieure ou supérieure à la liste d'origine (par exemple, si vous ajoutez une instruction next sur la boucle ou sinon sautez un élément).

Si possible, une solution beaucoup plus facile est de suivre le commentaire de d.b.