首页 文章

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

提问于
浏览
2

有了这个问题,我想扩展并概括讨论开始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 回答

  • 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")
    
  • 2

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

    同样,您可以调用 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))
    

相关问题