2

带着这个问题,我想扩展和概括从这里开始的讨论开始的讨论。这是为了像我这样在必须使用 lapply 时仍然遇到麻烦的人。

假设我有数据框d1并将d2其存储在列表中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我正在提取的列中的值是什么?(换句话说,在这里我将为每个数据帧创建两个向量,它们可以是免费的或存储在列表列表中)。对于后一点,我无法提出任何建议......

4

2 回答 2

2

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

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

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

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

lapply(my.ls, function(d) lapply(d[c(1,3)], unique))
于 2013-11-13T15:34:35.457 回答
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")
于 2013-11-13T15:34:49.763 回答