R:运行 函数 + for 循环后列表列表中的空列表

R: empty lists inside list of lists after running function + for loop

我有一个数据框列表,其中包含两列变量:var1 和 var2。 var1 和 var2 中的几个变量是 NA。现在,我想创建一个新的数据帧列表,其中每个数据帧仅包含那些在 var1 或 var2 中没有 NA 值的行。

这是我的数据集的结构:

df1 = data.frame(ID = c(1, 2, 3, 4, 5),
                 var1 = c(0.1, 0.24, 0.11, 0.8, NA),
                 var2 = c(1, NA, 0, NA, 1))
df2 = data.frame(ID = c(1, 2, 3, 4, 5),
                 var1 = c(NA, NA, 0.11, 0.8, 0.1),
                 var2 = c(100, 19, NA, 9, NA))
df3 = data.frame(ID = c(1, 2, 3, 4, 5),
                 var1 = c(0.12, 0.3, 0.5, NA, 0.84),
                 var2 = c(100, 19, 2, 9, 10))
df_list = list(df1, df2, df3)

这是我为完成任务而写的(函数内的 for 循环):

out = lapply(df_list, function(x) {
  dfList = list()
  for (i in c(2:3)) {
    df = x[complete.cases(x[ , i]),]
    dfList[[i]] = list(df)
  }
  return(dfList)
}) 

现在,这可行,但不是最优的。原因是输出创建了一个列表列表,其中一些列表不包含任何值:

> out

[[1]]
[[1]][[1]]
NULL

[[1]][[2]]
[[1]][[2]][[1]]
  ID var1 var2
1  1 0.10    1
2  2 0.24   NA
3  3 0.11    0
4  4 0.80   NA


[[1]][[3]]
[[1]][[3]][[1]]
  ID var1 var2
1  1 0.10    1
3  3 0.11    0
5  5   NA    1



[[2]]
[[2]][[1]]
NULL

[[2]][[2]]
[[2]][[2]][[1]]
  ID var1 var2
3  3 0.11   NA
4  4 0.80    9
5  5 0.10   NA


[[2]][[3]]
[[2]][[3]][[1]]
  ID var1 var2
1  1   NA  100
2  2   NA   19
4  4  0.8    9



[[3]]
[[3]][[1]]
NULL

[[3]][[2]]
[[3]][[2]][[1]]
  ID var1 var2
1  1 0.12  100
2  2 0.30   19
3  3 0.50    2
5  5 0.84   10


[[3]][[3]]
[[3]][[3]][[1]]
  ID var1 var2
1  1 0.12  100
2  2 0.30   19
3  3 0.50    2
4  4   NA    9
5  5 0.84   10

我想避免在我的输出中出现那些空列表,但未能找出我的代码的问题。有什么想法吗?

从2开始循环,然后赋值,所以1留空

lapply(df_list, \(x) lapply(2:3, \(i)  list(x[complete.cases(x[[i]]),])))

-输出

[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
  ID var1 var2
1  1 0.10    1
2  2 0.24   NA
3  3 0.11    0
4  4 0.80   NA


[[1]][[2]]
[[1]][[2]][[1]]
  ID var1 var2
1  1 0.10    1
3  3 0.11    0
5  5   NA    1



[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
  ID var1 var2
3  3 0.11   NA
4  4 0.80    9
5  5 0.10   NA


[[2]][[2]]
[[2]][[2]][[1]]
  ID var1 var2
1  1   NA  100
2  2   NA   19
4  4  0.8    9



[[3]]
[[3]][[1]]
[[3]][[1]][[1]]
  ID var1 var2
1  1 0.12  100
2  2 0.30   19
3  3 0.50    2
5  5 0.84   10


[[3]][[2]]
[[3]][[2]][[1]]
  ID var1 var2
1  1 0.12  100
2  2 0.30   19
3  3 0.50    2
4  4   NA    9
5  5 0.84   10

注意:在 OP 的代码中,returnFilter 取出 NULL 元素后

...
 return(Filter(Negate(is.null), dfList))
...