【问题标题】:R: Subset list of data frames by row content? lapply/sapplyR:按行内容的数据框子集列表?应用/应用
【发布时间】:2016-06-14 06:53:09
【问题描述】:

我有一个数据框列表:

d1<-data.frame(a=rnorm(5), b=rep(2006, times=5), cc=c(1:5))
d2<-data.frame(a=rnorm(5), b=rep(2007, times=5), cc=c(1:5))
d3<-data.frame(a=rnorm(5), b=c(2005:2009), cc=c(1:5))   #data frame with only one 2007 value
d4<-data.frame(a=rnorm(5), b=rep(2007, times=5), cc=c(1:5))


my.ls<- list(d1, d2, d3,d4)

仅包含 b == 2006 的子集 data.frames

如何只选择/子集一个数据框 b == 2007

我相信这很简单

my.ls[sapply(my.ls[[i]]$b) == 2007]

但我无法弄清楚... 如何访问数据框列表中的行?谢谢!


比较结果:

a1<-Filter(function(x) all(x$b==2007), my.ls)
a2<-my.ls[sapply(my.ls,  function(x) all(x$b==2007))]

> identical(a1, a2)
[1] TRUE

【问题讨论】:

    标签: r subset lapply sapply


    【解决方案1】:

    目前尚不清楚我们是否需要将data.frames 的list 与'b' 列中的any 2007 或allall 设置为2007。从示例中假设,它是all 2007,我们将 Filter 与匿名函数调用一起使用,并将 all 包裹在逻辑索引 (x$b ==2007) 周围,以获得单个 TRUE/FALSE 来子集 list 元素。

    Filter(function(x) all(x$b==2007), my.ls)
    

    或者使用sapply,我们沿着list元素循环,并使用相同的logical条件为每个list元素返回一个TRUE/FALSE。使用逻辑索引的vector 子集list

    my.ls[sapply(my.ls,  function(x) all(x$b==2007))]
    

    【讨论】:

    • 太棒了!谢谢@akrun,我真的迷失在这些 apply mapply lapply 函数中......
    • 关于你的问题,我有相同的结果应用这两种方法,所以我没有真正看到区别。我只想返回一个数据框,其中 b 列仅包含 2007。这两个建议都有效在这一点上很棒。当 2007 年只有 1 行时,它似乎不起作用。但是,这不是我的情况(但我已经更新了我的示例),所以它工作得很好。再次感谢!
    • @akrun;同样的问题,但在许多多元时间序列数据中,如何从每个时间序列的末尾开始向后选择行范围?就像每个时间序列数据由 1970-2004 组成,我想在每个时间序列中选择 1、3、5、..backwards,如 ,2004、2003 和 2004、2002、2003 和 2004,我该怎么做!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 2016-11-04
    • 2013-11-19
    • 2019-07-13
    • 1970-01-01
    • 2021-12-16
    • 2020-12-29
    • 2021-09-16
    相关资源
    最近更新 更多