如何按行数筛选嵌套的数据框列表,并在R中从列表中删除筛选后的数据框?

3
这应该是一个简单的问题,但我无法获得我想要的确切输出。我有一个含嵌套数据框列表,并且我想过滤所有小于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)))

这个方法可以处理第一个列表,但会将嵌套列表中的mtcars数据框替换为NULL - 它并没有从列表中移除它们。不幸的是,它也无法循环遍历其他列表。我还尝试过使用过滤函数。

test <- lapply(List, function(x) lapply(x, function(x) filter(x, nrow(x)>50)))

这个问题与没有循环遍历所有列表是相同的,对于第一个列表留下了一个空的df,但它仍然是列表的一个元素。我最后的解决方案是写一个for循环,只在嵌套中的第一个列表上尝试,大部分情况下可以工作——但如果可能的话,我希望找到一种更简洁的方法来解决这个问题。这也会返回一个错误:Error in List[[1]][[ii]] : subscript out of bounds

for (ii in seq_along(List[[1]])){
n_rows = nrow(List[[1]][[ii]])
    if (n_rows < 20){
        List[[1]][[ii]] = NULL
      }
    }

我很希望很快就能找到一个简单的解决方案!
3个回答

5

一个选项可能是:

lapply(List, function(x) Filter(function(y) nrow(y) >= 50, x))

这就是诀窍!我知道我快成功了 - 但似乎将 F 大写并使用 y 会有很大的区别,谢谢你 - 我学到了新东西! - Brewkeeper
1
@Brewkeeper Base R的Filter函数与在本网站上经常看到且经常被忽视的dplyr::filter函数非常不同。 - Ian Campbell
谢谢 - 显然了解它们两个非常有价值! - Brewkeeper

3
使用 purrr 库:
List %>% map(~keep(.x, ~nrow(.x) >= 50))

@det 不是对你的回答进行批评,只是让你知道不需要包含额外的库调用。 - Ian Campbell

1
这是一个使用的选项。
lapply(List, function(x) x[sapply(x, nrow)>=50])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接