【问题标题】:Work with data frames stored in lists处理存储在列表中的数据框
【发布时间】:2013-11-13 15:28:00
【问题描述】:

带着这个问题,我想扩展和概括开始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 值是什么? (换句话说,在这里我将为每个数据帧创建两个向量,这些向量可以是免费的或存储在列表列表中)。对于后一点,我无法提出任何建议......

【问题讨论】:

    标签: r list dataframe lapply


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 谢谢。你也能用 lapply 解决问题的第二部分吗?
    • 很好的答案。谢谢。
    【解决方案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))
    

    【讨论】:

    • @Matthew Plourde 是的,超级快。谢谢!问题的第二部分呢?我可以用 lapply 做到这一点吗?
    猜你喜欢
    • 2018-09-23
    • 2019-02-03
    • 1970-01-01
    • 2015-01-09
    • 2018-12-06
    • 1970-01-01
    • 2019-10-19
    • 2021-09-11
    • 2018-06-21
    相关资源
    最近更新 更多