Premier poste d'échange de pile, veuillez donc me supporter J'essaie d'automatiser la création d'une liste, et la liste sera composée de nombreux vecteurs vides de différentes longueurs connues. Les vecteurs vides seront alors remplis de données simulées. Comment puis-je automatiser la création de cette liste en utilisant une boucle for dans R?

Dans cet exemple simplifié, les poissons ont été capturés en lançant un filet 4 fois, et leur abondance est donnée dans le vecteur «abondance» (en comptant le nombre total de poissons dans chaque filet). Nous n'avons pas de poids de poisson individuel, juste le poids moyen de tous les poissons de chaque filet, donc je dois simuler leurs poids à partir d'une distribution log-normale. Donc, je cherche ensuite à remplir ces vecteurs vides pour chaque filet, chacun avec une longueur égale au nombre de poissons capturés dans ce filet, avec des données de poids simulées à partir d'une distribution log-normale avec une moyenne et un écart-type connus.

Un exemple simplifié de mon code:

abundance <- c(5, 10, 9, 20)
net1 <- rep(NA, abundance[1])
net2 <- rep(NA, abundance[2])
net3 <- rep(NA, abundance[3])
net4 <- rep(NA, abundance[4])

simulated_weights <- list(net1, net2, net3, net4)

#meanlog vector for each net
weight_per_net

#meansd vector for each net
sd_per_net

for (i in 1:4) {
  simulated_weights[[i]] <- rlnorm(n = abundance[i], meanlog = weight_per_net[i], sd = sd_per_net[i])
  print(simulated_weights_VM)
}

Quelqu'un pourrait-il m'aider à automatiser cela afin que je n'ai pas à écrire chaque vecteur net (par exemple net1) à la main, puis à écrire tous les noms de réseau dans la fonction list ()? Il y a beaucoup plus de filets que 4 donc cela prendrait beaucoup de temps et serait inefficace de le faire de cette façon. J'ai essayé plusieurs choses à partir d'autres articles comme paste0 (), d'autres boucles for, as.list (c ()), tout cela en vain.

Merci! HM

0
hmcmonag 29 août 2020 à 01:45

2 réponses

Meilleure réponse

Il s'avère que vous n'avez pas du tout besoin des variables net1, net2, etc. Tu peux juste faire

abundance <- c(5, 10, 9, 20)
simulated_weights <- lapply(abundance, function(x) rep(NA, x))

La fonction lapply retournera la liste dont vous avez besoin en appelant la fonction une fois pour chaque valeur de abundance

0
MrFlick 28 août 2020 à 23:12

Nous pourrions créer les "simulated_weights" avec split et rep

simulated_weights <- split(rep(rep(NA, length(abundance)), abundance),  
            rep(seq_along(abundance), abundance))
0
akrun 28 août 2020 à 23:24