如何按行数过滤数据帧的嵌套列表并从 R 列表中删除过滤的数据帧?

Bre*_*per 3 nested r list rows filter

这应该是一个需要解决的简单问题,但我无法获得我想要的确切输出。我有一个嵌套的数据帧列表,我想过滤掉所有少于 50 行的数据帧,并将它们从列表中删除。

这是我尝试过的可重现的示例 -

L <- list(iris,mtcars,iris)
O <- list(iris,mtcars,iris)
H <- list(iris,mtcars,iris)
  List <- list(L,O,H)

test <- lapply(List, function(x) lapply(x, function(x) if (nrow(x)<50) NULL else x)))
Run Code Online (Sandbox Code Playgroud)

这适用于第一个列表,但它用 NULL 替换嵌套列表中的 mtcars 数据帧 - 它不会将它们从列表中删除。不幸的是,它不会循环其他列表。我也尝试过使用过滤功能

test <- lapply(List, function(x) lapply(x, function(x) filter(x, nrow(x)>50)))
Run Code Online (Sandbox Code Playgroud)

这与不循环所有列表有同样的问题,对于第一个列表,它给我留下了一个空的 df ,它仍然是列表的一个元素。我的最后一个解决方案是编写一个 for 循环,我在嵌套中的第一个列表上尝试了它,这基本上有效 - 但如果可能的话,我想找到一种不太笨重的方法来做到这一点。这也会返回一个错误:Error in List[[1]][[ii]] : subscript out ofbounds

for (ii in seq_along(List[[1]])){
n_rows = nrow(List[[1]][[ii]])
    if (n_rows < 20){
        List[[1]][[ii]] = NULL
      }
    }
Run Code Online (Sandbox Code Playgroud)

我希望有一个简单的解决方案即将出现!

tmf*_*mnk 5

一种选择可能是:

lapply(List, function(x) Filter(function(y) nrow(y) >= 50, x))
Run Code Online (Sandbox Code Playgroud)