基于元素列表 b 对列表 a 中的元素进行子集化
Subsetting elements in list a based on elements list b
我有 2 个列表:
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 中的整数向量对列表 a 中的字符向量进行子集化。这样我最终会得到一个包含 c1(只有 e 和 g)和 c2(只有 k 和 m)的新列表 (list3)。我目前正在研究 plyr 的可能性,因此解决方案最好是使用 plyr。我尝试了类似的方法,但无济于事。
list3 <- llply(list1, function (x) x[list2])
您可以尝试使用 Map
使用 base R
,这会比使用 llply
的更紧凑。基本上,您有两个列表元素数量相同的列表,并希望根据 ("list2") 的索引列表元素对第一个列表 ("list1") 的每个列表元素进行子集化。 Map
将比较 "list1" 和 "list2" 的相应元素以及使用 [
的子集
Map(`[`, list1, list2)
与
相同
Map(function(x,y) x[y], list1, list2)
或使用 plyr
中的 llply
(您实际上并不需要 llply
)。这可以通过 lapply
本身来实现。关键是比较两个列表的相应元素,并且 link 两者(当它们具有相同元素时)的可能方法是使用 seq_along
,这将使您获得一个列表中的元素序列( 1:3
) 并使用该索引获取列表和子集的相应元素。
llply(seq_along(list1), function(i) list1[[i]][list2[[i]]])
我有 2 个列表:
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 中的整数向量对列表 a 中的字符向量进行子集化。这样我最终会得到一个包含 c1(只有 e 和 g)和 c2(只有 k 和 m)的新列表 (list3)。我目前正在研究 plyr 的可能性,因此解决方案最好是使用 plyr。我尝试了类似的方法,但无济于事。
list3 <- llply(list1, function (x) x[list2])
您可以尝试使用 Map
使用 base R
,这会比使用 llply
的更紧凑。基本上,您有两个列表元素数量相同的列表,并希望根据 ("list2") 的索引列表元素对第一个列表 ("list1") 的每个列表元素进行子集化。 Map
将比较 "list1" 和 "list2" 的相应元素以及使用 [
Map(`[`, list1, list2)
与
相同Map(function(x,y) x[y], list1, list2)
或使用 plyr
中的 llply
(您实际上并不需要 llply
)。这可以通过 lapply
本身来实现。关键是比较两个列表的相应元素,并且 link 两者(当它们具有相同元素时)的可能方法是使用 seq_along
,这将使您获得一个列表中的元素序列( 1:3
) 并使用该索引获取列表和子集的相应元素。
llply(seq_along(list1), function(i) list1[[i]][list2[[i]]])