如何对列表中存储的data.frame进行子集化?

时间:2013-11-13 11:42:39

标签: r list dataframe subset lapply

我创建了一个列表,并在每个组件中存储了一个数据框。现在我想过滤那些数据帧,只保留特定列中具有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

}

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

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

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

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:5)

关于@ Riccardo最后评论中的问题,请尝试:

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

或者:

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

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