如何按行数过滤嵌套的数据框列表并从 R 中的列表中删除过滤后的数据框?
How to filter a nested list of dataframes by row count and remove filtered dataframes from list in R?
这应该是一个很容易解决的问题,但我无法获得我想要的准确输出。我有一个嵌套的数据框列表,我想过滤掉所有少于 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 循环,我只是在嵌套的第一个列表上尝试过,它大部分都有效——但如果可能的话,我想找到一种不那么笨拙的方法来做到这一点。这也是 returns 一个错误:列表 [[1]][[ii]] 中的错误:下标越界
for (ii in seq_along(List[[1]])){
n_rows = nrow(List[[1]][[ii]])
if (n_rows < 20){
List[[1]][[ii]] = NULL
}
}
我希望很快就会有一个简单的解决方案!
一个选项可以是:
lapply(List, function(x) Filter(function(y) nrow(y) >= 50, x))
使用 purrr
库:
List %>% map(~keep(.x, ~nrow(.x) >= 50))
这里有一个选项sapply/lapply
lapply(List, function(x) x[sapply(x, nrow)>=50])
这应该是一个很容易解决的问题,但我无法获得我想要的准确输出。我有一个嵌套的数据框列表,我想过滤掉所有少于 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 循环,我只是在嵌套的第一个列表上尝试过,它大部分都有效——但如果可能的话,我想找到一种不那么笨拙的方法来做到这一点。这也是 returns 一个错误:列表 [[1]][[ii]] 中的错误:下标越界
for (ii in seq_along(List[[1]])){
n_rows = nrow(List[[1]][[ii]])
if (n_rows < 20){
List[[1]][[ii]] = NULL
}
}
我希望很快就会有一个简单的解决方案!
一个选项可以是:
lapply(List, function(x) Filter(function(y) nrow(y) >= 50, x))
使用 purrr
库:
List %>% map(~keep(.x, ~nrow(.x) >= 50))
这里有一个选项sapply/lapply
lapply(List, function(x) x[sapply(x, nrow)>=50])