web-dev-qa-db-fra.com

fonction lapply / boucles sur la liste des listes R

Je sais que ce sujet est apparu sur SO plusieurs fois, mais les exemples étaient souvent plus compliqués et j'aimerais avoir une réponse (ou un ensemble de solutions possibles) à cette situation simple. Je suis toujours Envelopper ma tête autour de R et de la programmation en général. Donc ici je veux utiliser la fonction lapply ou une simple boucle vers data list qui est une liste de trois listes de vecteurs.

data1 <- list(rnorm(100),rnorm(100),rnorm(100))
data2 <- list(rnorm(100),rnorm(100),rnorm(100))
data3 <- list(rnorm(100),rnorm(100),rnorm(100))

data <- list(data1,data2,data3)

Maintenant, je veux obtenir la liste des moyennes pour chaque vecteur. Le résultat serait une liste de trois éléments (listes).

Je sais seulement comment obtenir la liste des résultats pour une liste de vecteurs et

for (i in 1:length(data1)){
        means <- lapply(data1,mean)
}

ou par:

lapply(data1,mean)

et je sais obtenir tous les moyens en utilisant rapply:

rapply(data,mean)

Le problème est que rapply ne maintient pas la structure de la liste. De l'aide et éventuellement quelques conseils/explications seraient très appréciés.

18
MIH

Nous pouvons parcourir la liste des listes avec un lapply/sapply Imbriqué

 lapply(data, sapply, mean)

Il est autrement écrit comme

 lapply(data, function(x) sapply(x, mean))

Ou si vous avez besoin de la sortie avec la structure list, un lapply imbriqué peut être utilisé

 lapply(data, lapply, mean)

Ou avec rapply, nous pouvons utiliser l'argument how pour obtenir le type de sortie que nous voulons.

  rapply(data, mean, how='list')

Si nous utilisons une boucle for, nous devrons peut-être créer un objet pour stocker les résultats.

  res <- vector('list', length(data))
  for(i in seq_along(data)){
    for(j in seq_along(data[[i]])){
      res[[i]][[j]] <- mean(data[[i]][[j]])
    }
   }
48
akrun