假设我有四个data.frame的列表,其中包含一些NA值:
my.list<-replicate(4,data.frame())
names(my.list)<-paste0("Frame.Number", c(1:4))
for (i in 1:4){
my.list[[i]]<-mapply(rnorm,10,c(1:4))
my.list[[i]][i+1,3]<-NA
my.list[[i]][c(i,i*2),4]<-NA
}
对于每个data.frame,我想选择第4列中不包含NA的那些行。例如,我可以创建一个向量列表(?),其中包含有关每个data.frame中案例完整性的信息:
selector <- lapply(my.list,"[",, 4)
selector <- lapply(selector,complete.cases)
现在这就是我遇到的问题:如何将selector
列表应用于my.list
列表,以便仅选择完整的案例?我以为我可以再次使用lapply
,但是我无法弄清楚一些有意义的语法。
答案 0 :(得分:2)
我们可以lapply
在列表上方,选择第4列并获取非NA值的索引,并相应地对矩阵进行子集化。
lapply(my.list,function(x) x[!is.na(x[,4]), ])
#$Frame.Number1
# [,1] [,2] [,3] [,4]
#[1,] 0.3668229 2.0688573 2.466580 4.339755
#[2,] -0.6391422 3.2635271 2.011809 3.296089
#[3,] 0.8662670 2.2797301 4.838563 4.443876
#[4,] -0.8972108 2.9305257 3.461650 5.525453
#[5,] -0.3452349 -0.2211153 2.570717 3.915671
#[6,] 0.6464616 2.3472838 4.009406 3.436188
#[7,] 0.9341354 2.3092428 2.338770 4.359324
#[8,] -0.5652311 3.2143472 1.944220 4.042566
#$Frame.Number2
# [,1] [,2] [,3] [,4]
#[1,] 0.22304364 2.6085569 3.459335 2.575920
#[2,] -0.08987518 2.9515099 NA 3.775579
#[3,] 2.03265254 0.9405609 3.266783 4.009509
....