0

最初のスタック交換投稿ですので、ご容赦ください。リストの作成を自動化しようとしていますが、リストはさまざまな既知の長さの多くの空のベクトルで構成されます。空のベクトルは、シミュレートされたデータで埋められます。Rでforループを使用してこのリストの作成を自動化するにはどうすればよいですか?

この単純化された例では、魚は網を 4 回投げることによって捕獲され、その量はベクトル "abundance" で与えられます (各網の総魚数のカウントから)。個々の魚の重さはなく、網ごとのすべての魚の平均重さがあるだけなので、対数正規分布からそれらの重さをシミュレートする必要があります。そこで、各網の空のベクトルを埋めようとしています。それぞれの長さは、その網で捕獲された魚の数に等しく、重量データは既知の平均と標準偏差を持つ対数正規分布からシミュレートされます。

私のコードの簡単な例:

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)
}

各ネットベクトル (net1 など) を手動で書き出す必要がないように、これを自動化するのを手伝ってくれませんか? 4 つよりもはるかに多くのネットがあるため、この方法では非常に時間がかかり、非効率的です。paste0()、他の for ループ、as.list(c()) などの他の投稿からいくつか試してみましたが、すべて役に立ちませんでした。

ありがとう!HM

4

2 に答える 2

0

net1、、net2などの変数はまったく必要ないことがわかりました。あなたはただすることができます

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

lapply関数は、各値に対して関数を 1 回呼び出すことで、必要なリストを返します。abundance

于 2020-08-28T23:12:38.623 に答える
0

splitとで「simulated_weights」を作成できますrep

simulated_weights <- split(rep(rep(NA, length(abundance)), abundance),  
            rep(seq_along(abundance), abundance))
于 2020-08-28T22:48:10.673 に答える