J'ai une liste
comme celle-ci:
mean(c(1, 2, 3), na.rm = T) # = 2 mean(c(2, 3, 4), na.rm = T) # = 3 mean(c(3, 4, NA), na.rm = T) # = 3.5 mean(c(4, NA, NA), na.rm = T) # = 4
qui est créée par purrr :: map ()
. Comment puis-je calculer les moyennes des valeurs dans les cellules correspondantes? c'est-à-dire
x y 1 2 3.5 2 3 4
où
(mylist <- list(a = data.frame(x = c(1, 2), y = c(3, 4)), b = data.frame(x = c(2, 3), y = c(4, NA)), c = data.frame(x = c(3, 4), y = c(NA, NA)))) $a x y 1 1 3 2 2 4 $b x y 1 2 4 2 3 NA $c x y 1 3 NA 2 4 NA
Merci pour votre aide!
3 Réponses :
Une méthode serait de convertir votre liste en tableau, puis d'appliquer la fonction moyenne à travers la troisième dimension du tableau:
apply(array(unlist(mylist), dim=c(nrow(mylist[[1]]),ncol(mylist[[1]]),length(mylist))), c(1,2), mean, na.rm=T)
Si vous vouliez faire tout cela en un tourné, sans coder en dur les dimensions, vous pourriez faire:
my_array <- array(unlist(mylist), dim=c(2,2,3)) apply(my_array, c(1,2), mean, na.rm=T) # [,1] [,2] # [1,] 2 3.5 # [2,] 3 4.0
Une option purrr
library(purrr) map_df(transpose(mylist), ~rowMeans(as.data.frame(.x), na.rm = TRUE)) # A tibble: 2 x 2 # x y # <dbl> <dbl> #1 2 3.5 #2 3 4
nm = c("x", "y") # could do `nm = names(mylist[[1]])` sapply(nm, function(NM) rowMeans(do.call(cbind, lapply(mylist, function(x) x[NM])), na.rm = TRUE)) # x y #[1,] 2 3.5 #[2,] 3 4.0