使用存储在列表中的数据框

时间:2013-11-13 15:28:00

标签: r list dataframe lapply

有了这个问题,我想扩展并概括讨论的开始here。这是为了那些像我一样,在必须使用lapply时仍然遇到麻烦的人的利益。

假设我有数据框d1d2,我将其存储在列表my.ls

d1<-data.frame(a=rnorm(5), b=c(rep(2006, times=4),NA), c=letters[1:5])
d2<-data.frame(a=1:5, b=c(2007, 2007, NA, NA, 2007), c=letters[6:10])
my.ls<-list(d1=d1, d2=d2)

如何获得另一个具有相同数据框的列表,我只保留第一列和第三列?我尝试了以下内容,但它没有工作

my.ls.sub<-lapply(my.ls, my.ls[,c(1,3)])

如果那样的话,我不仅想要对数据帧进行子集化,而且还想知道我提取的列中的unique值是什么? (换句话说,在这里,我将为每个数据帧创建两个向量,这些向量可以是空闲的或存储在列表列表中)。对于后一点,我无法提出任何建议......

2 个答案:

答案 0 :(得分:2)

你很亲密:lapply(my.ls, '[', c(1,3))。这将使用附加参数[调用每个data.frame上的索引函数c(1,3),指定第一列和第三列。

等效地,您可以调用lapply(my.ls, '[', -2)删除第二列。

但我会推荐更易理解的lapply(my.ls, subset, select=c(1,3))

要直接从原始列表转到每个data.frame的每列中唯一值的列表,您可以使用嵌套的lapply语句,如下所示:

lapply(my.ls, function(d) lapply(d[c(1,3)], unique))

答案 1 :(得分:2)

试试这个

lapply(my.ls, "[", ,c(1,3))

或者编辑一下代码会产生:

lapply(my.ls, function(x) x[, c(1,3)])

修改

由于@Matthew Plourde已使用lapply回答了问题的第二部分,因此我使用rapplylapply的递归版本为您提供了另一种方法。

rapply(lapply(my.ls, "[", ,c(1,3)), unique, how="list")