2015-01-11 218 views
1

我有2所列出:子集元素基於元素表b

c1 <- c("e","f","g","h") 
c2 <- c("j","k","l","m") 
list1 <- list(c1,c2) 
i1 <- c(1,3) 
i2 <- c(2,4) 
list2 <- list(i1,i2) 

我想在子集列表中的字符向量基於在表b整數向量。這樣我最終會得到一個包含c1(只有e和g)和c2(只有k和m)的新列表(list3)。我目前正在研究plyr的可能性,因此解決方案應該最好使用plyr。我嘗試了類似的東西,但無濟於事。

list3 <- llply(list1, function (x) x[list2]) 

回答

4

您可以嘗試使用Map,這將是一個比用llply更緊湊base R。基本上,你有兩個具有相同數量的列表元素的列表,並且希望基於(「list2」)的索引列表元素將第一列表(「列表1」)的每個列表元素子集。 Map將使用[

Map(`[`, list1, list2) 

這是一樣的

Map(function(x,y) x[y], list1, list2) 

,或利用plyrllply比較「列表1」和「列表2」和子集的相應元素(你並不真的需要llply )。這可以通過lapply本身來實現。關鍵是比較兩個列表的相應元素,並且可以鏈接兩個元素(當它們具有相同元素時)的可能方式是使用seq_along,這將獲得一個列表中的元素序列(1:3)並使用該索引獲取列表和子集的相應元素。

llply(seq_along(list1), function(i) list1[[i]][list2[[i]]]) 
+0

謝謝你,這兩種解決方案正是我一直在尋找的。您是否想解釋第二種解決方案的工作原理? Seq_along(list1)返回一個整數向量,我不明白你如何從那裏得到最終的解決方案。 – 1053Inator

+1

@ 1053Inator我會更新一些解釋。 – akrun