R中的子集

时间:2014-04-29 16:40:46

标签: r

x <- list(l1=list(1:4),l2=list(2:5),l3=list(3:8))

我知道[]用于提取多个元素,[[]]用于提取列表中列表中的单个元素。我需要帮助提取另一个列表中的列表中的多个元素。例如,我需要从另一个列表中的列表l1中提取1,3?

2 个答案:

答案 0 :(得分:1)

有关详细信息,请参阅help(Extract),其中包含[[[

[[运算符可以通过提供名称​​ OR 索引(路径)的向量,在一个步骤中遍历/搜索嵌套列表:

> y = list(a=list(b=1))
> y[[c("a","b")]]
[1] 1
> y[[c(1,1)]]
[1] 1

您无法混合名称和索引:

> y[[c("a",1)]]
NULL

您似乎在问一个不同的问题,因为您的内部列表未命名。

这是一个仅使用数字索引的解决方案:

> x[[c(1,1)]]
[1] 1 2 3 4
> x[[c(1,1)]][c(1,3)]
[1] 1 3

第一个获取第一个列表的第一个元素。第二个展开它以展示内部的矢量。

如果你的真实用例涉及更复杂的路径,这可能会有用,但为了避免让其他程序员感到惊讶,在给定的例子中如下......

x[["l1"]][[1]][c(1,3)]

......可能更可取。第二个1打开列表。

在您的情况下,以下内容也是等效的

unlist(x[["l1"]])[c(1,3)]

答案 1 :(得分:0)

听起来就像您可能有兴趣探索rapply函数一样(递归lapply)。

如果我理解你的问题,你可以这样做:

rapply(x[["l1"]], f=`[`, ...=c(1, 3))
# [1] 1 3

与以下内容略有不同:

lapply(x[["l1"]], `[`, c(1, 3))
# [[1]]
# [1] 1 3