【问题标题】:How to subset data.frames stored in a list?如何对存储在列表中的 data.frames 进行子集化?
【发布时间】:2013-11-26 00:01:36
【问题描述】:

我创建了一个列表,并在每个组件中存储了一个数据框。现在我想过滤那些数据框,只保留特定列中具有 NA 的行。我希望这个操作的结果是另一个包含数据框的列表,其中只有那些行在该列中具有 NA。

这里有一些代码来澄清我在说什么。假设 d1d2 是我的数据框

set.seed(1)

d1<-data.frame(a=rnorm(5), b=c(rep(2006, times=4),NA))
d2<-data.frame(a=1:5, b=c(2007, 2007, NA, NA, 2007))  

print(d1)
 a    b
 1.3011543 2006
 0.3780023 2006
-0.3101449 2006
-1.3927445 2006
-1.0726218   NA

print(d2)
a    b
1 2007
2 2007
3   NA
4   NA
5 2007

我将它放在一个带有 for 循环的列表中

ls<-list()

for (i in 1:2){ 

  str<-paste("d", i, sep="")
  dat<-get(str)
  ls[[str]]<-dat

}

现在我想过滤每个列表组件,以便只保留 b 列中包含 NA 的行。为此,我尝试使用以下命令,从一开始就知道它会失败。我的问题是我不知道subset() 是否是正确使用的函数,如果是,我不知道如何限定每个数据帧(即子集函数的第一个元素)

lsNA<-lapply(ls, subset(ls, is.na(b)))

你能帮我克服我的严重限制吗?

【问题讨论】:

    标签: r list dataframe subset lapply


    【解决方案1】:

    lapply 的第二个参数是一个函数 (subset),subset 的额外参数作为... 参数传递给lapply。因此:

    my.ls <- list(d1 = d1, d2 = d2)
    my.lsNA <- lapply(my.ls, subset, is.na(b))
    

    (我还向您展示了如何在不使用get 的情况下轻松创建data.frames 列表,并建议您不要使用ls 作为变量名,因为它也是一个相当常见的函数的名称.)

    【讨论】:

    • 非常感谢。你在一个答案中教会了我两件事。
    • 假设我不想过滤 NA 我只想保留每个数据帧的第一列,我可以使用什么命令?我认为命令 my.ls2 会起作用,但它没有。这让我觉得我对 lapply 还是一无所知...
    【解决方案2】:

    关于@Riccardo 上一条评论中的问题,请尝试:

    lapply(my.ls, "[", 1)
    

    或者:

    lapply(my.ls, "[[", 1)
    

    取决于您希望输出是数据帧列表还是向量列表。

    【讨论】:

    • 这适用于子集 columnslapply(my.ls, "[", 1:2) 将保留列表中所有数据框的第一列和第二列。
    猜你喜欢
    • 2012-08-06
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2017-04-02
    • 2012-10-10
    • 2019-11-08
    相关资源
    最近更新 更多