2015-11-13 48 views
1

假人示例的列表的:如何拉出來的值基於列表索引的向量中的R

1> L = vector('list',100)#prefill empty list 
1> for (i in 1:100){ 
1+ L[[i]]$letter = letters[rgeom(1,.5)+1]#populate it with a letter 
1+ L[[i]]$number = runif(1)#and a number 
1+ } 
1> i = ceiling(runif(100,0,100))#an (arbitrary) vector of indices 
1> x = L[[i]]$letter #I want the ith letter 
Error in L[[i]] : no such index at level 2 

我想x包含的Li th元素的letter對象。 (i的順序與x的索引順序沒有任何關係)

什麼是不帶回路的好方法?

這裏是複製/粘貼從我的編輯,而不是我的終端窗口,對於那些誰可能更容易:

L = vector('list',100) 
for (i in 1:100){ 
    L[[i]]$letter = letters[rgeom(1,.5)+1] 
    L[[i]]$number = runif(1) 
} 
i = ceiling(runif(100,0,100)) 
x = L[[i]]$letter 
+0

你的'1''和'+'在行首會讓你很難複製粘貼並嘗試你的代碼 – Frank

+0

@Frank你怎麼樣? –

+1

當然,謝謝。問題似乎是:'我'是一個矢量,而不是一個數字,而[[]]'只需要一個數字。如果你想抓住每個數字的'letter','sapply(L [i],''[[\',「letter」)'應該工作。不知道這是你之後的事情。 – Frank

回答

2

相關文件是在help("[[")

最重要[,[[$之間的區別在於[可以選擇多於一個元素,而另外兩個選擇單個元素。

所以,我們需要用L[i]來提取數值。

從那裏,訪問每個L[i]元素的$letter一部分,我們可以使用sapply

sapply(L[i], `[[`, "letter") 

人們很容易使用$代替[[這裏,但for obscure reasons, it's not a good idea


評論。此評論有用嗎?下面是構建一些示例數據的另一種方法。

set.seed(1) 
L = replicate(100, list(
    letter = letters[rgeom(1,.5)+1], 
    number = runif(1) 
), simplify = FALSE) 
i = sample(100, 100, replace=TRUE) 

常常是有用的把一個set.seed提前隨機生成的例子,這樣每個人都在尋找同樣的事情。