簡體   English   中英

將結果存儲在 r 中的 for 循環中

[英]Store results within a for loop in r

我正在嘗試創建一個包含 4 個不同維度的數據集的列表,並將這些結果存儲在 data_m 中,以便擁有例如維度為 50x20、100x20 之一的數據集,依此類推......但每次我運行代碼時我知道數據被重寫了,我得到了 4 個數據集,它們都相等,並且尺寸等於兩個 for 循環的最后一個尺寸......

希望有人可以幫助我提前謝謝

這是代碼:

multinom <- list()
multinom_z <- list()
var_m <- list()
var_mzeros <- list()
data_m <- list()  
data_mzeros <- list()
for (i in 1:4){
  for (p in c(20, 50)){
    for (n in c(50, 100)){
      set.seed(123)
      prob <- rep(1/p, p)
      multinom[[i]] <- t(rmultinom(n, p, prob = prob))
      zeros <- matrix(0, n, 85*p/100)
      multinom_z[[i]] <- cbind(multinom[[i]], zeros)
      data_m[[i]] <- data.frame(multinom[[i]])
    }
  }
}

如果您將print(i)添加到內部循環,您會看到運行了 16 個循環,而不是您期望的 4 個循環。 該代碼正在生成四個不同的data.frame ,但是第四個data.frame被保存為i的每個值的最后一次迭代。

這將刪除i循環並按名稱將data.frame保存到list

multinom <- list()
multinom_z <- list()
var_m <- list()
var_mzeros <- list()
data_m <- list()  
data_mzeros <- list()

set.seed(123)

for (p in c(20, 50)){
  for (n in c(50, 100)){
    prob <- rep(1/p, p)
    multinom<- t(rmultinom(n, p, prob = prob))
    zeros <- matrix(0, n, 85*p/100)
    multinom_z <- cbind(multinom, zeros)
    data_m[[sprintf('d%ix%i', p, n)]] <- data.frame(multinom)
  }
}

顯示 output 名稱和尺寸

> lapply(data_m, dim)
$d20x50
[1] 50 20

$d20x100
[1] 100  20

$d50x50
[1] 50 50

$d50x100
[1] 100  50

如果更喜歡按索引保留列表而不使用名稱,則可以在循環中使用以下內容

data_m[[length(data_m) + 1]] <- data.frame(multinom)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM