2016-06-10 251 views
0

我試圖填補使用功能rmultinom列表中的每個元素的每個元素:填充列表

# probabilities of group membership for 3 observations to be generated 
probs = data.frame("grp1"=c(.1, .9, 0), "grp2"=c(.2, .2, .6), "grp3"=c(.3,.1,.6)) 
n = length(probs) 

# generate a categorical variable 
cat.var = vector("list", n) # create vector of lists for each observation's indicators 
for (j in 1:n) cat.var[[j]] = rmultinom(1, 1, probs[j,]) 

# everything is NULL 
cat.var 

# yet the below works... 
cat.var[[1]] = rmultinom(1, 1, probs[1,]) 
cat.var[[2]] = rmultinom(1, 1, probs[2,]) 
cat.var[[3]] = rmultinom(1, 1, probs[3,]) 

我的問題是:

  1. 什麼是錯以上?
  2. 有沒有更好的方法來達到預期的效果,例如使用lapply?當我嘗試lapply時,我不確定如何使FUN變元對於列表的每個元素都不相同(即cat.var[[j]]應該被賦予由rmultinom(1, 1, probs[j,])生成的值)。
+0

'obs'給出哪裏? – coatless

+0

對不起!我編輯過它。 –

+0

我100%確定這是問題所在。 – coatless

回答

1

通過在for(i in 1:obs)改變obsfor(i in 1:n)和設置seed

# Set seed for reproducibility 
set.seed(113) 
for (j in 1:n) cat.var[[j]] = rmultinom(1, 1, probs[j,]) 

我得到:

cat.var 
    [[1]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 

[[2]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 

[[3]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 

而且隨着lapply寫它,我們創建一個輔助功能與x索引來迭代通過probs

set.seed(113) 

lstyle = function(x, n, size, prob){ 
    rmultinom(n, size, probs[x,]) 
} 

lapply(X = 1:n, FUN = lstyle, n = 1, size = 1, prob = probs) 

而我們得到:

[[1]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 

[[2]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 

[[3]] 
    [,1] 
grp1 0 
grp2 1 
grp3 0 
+0

織補。抱歉。我需要再次嘗試在一個簡短的例子中重新創建我的問題。 –