有了这个问题,我想扩展并概括讨论的开始here。这是为了那些像我一样,在必须使用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
值是什么? (换句话说,在这里,我将为每个数据帧创建两个向量,这些向量可以是空闲的或存储在列表列表中)。对于后一点,我无法提出任何建议......
答案 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
回答了问题的第二部分,因此我使用rapply
(lapply
的递归版本为您提供了另一种方法。
rapply(lapply(my.ls, "[", ,c(1,3)), unique, how="list")