R语言 如何从列表中删除空数据框?

5us2dqdw  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(131)

我有几十个列表,每个都是11个 Dataframe 的集合。某些数据框为空(另一个脚本没有输出任何数据,不是错误)。
我需要通过一个函数推送每个列表,但当它看到一个空 Dataframe 时,它会阻塞。那么,我如何编写一个函数,它将接受一个列表,对每个元素进行dim(即, Dataframe ),如果是0,则跳到下一个。
我试过这样的东西:

empties <- function (mlist)
{
 for(i in 1:length(mlist))
   {
    if(dim(mlist[[i]])[1]!=0) return (mlist[[i]])
    }
}

但很明显,这没用。我会手动在这一点上,但这将永远。帮忙吗?

abithluo

abithluo1#

我不确定这是否正是你所要求的,但是如果你想在运行函数之前将mlist精简到只包含非空 Dataframe ,那么试试mlist[sapply(mlist, function(x) dim(x)[1]) > 0]
例如:

R> M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
R> M2 <- data.frame(matrix(nrow = 0, ncol = 0))
R> M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2))
R> mlist <- list(M1, M2, M3)
R> mlist[sapply(mlist, function(x) dim(x)[1]) > 0]
[[1]]
  X1 X2
1  1  3
2  2  4

[[2]]
  X1 X2
1  9 11
2 10 12
jvlzgdj9

jvlzgdj92#

sapply/索引组合的一种稍微简单和更透明的方法是使用Filter()函数:

> Filter(function(x) dim(x)[1] > 0, mlist)
[[1]]
  X1 X2
1  1  3
2  2  4

[[2]]
  X1 X2
1  9 11
2 10 12
yzxexxkh

yzxexxkh3#

你可以使用nrow来代替dim(x)[1],所以你可以这样做,

mlist[sapply(mlist, nrow) > 0]

Filter(function(x) nrow(x) > 0, mlist)

您还可以使用purrr中的keepdiscard

purrr::keep(mlist, ~nrow(.) > 0)
purrr::discard(mlist, ~nrow(.) == 0)

purrr中也有compact,它直接删除所有空元素。它是discard上的 Package 器

purrr::compact(mlist)

如果你可以根据列数过滤列表,你可以在上面的答案中将nrow替换为ncol。此外,您还可以使用lengths来过滤列表。

mlist[lengths(mlist) > 0]
qhhrdooz

qhhrdooz4#

添加tidyverse选项:

library(tidyverse)
mlist[map(mlist, function(x) dim(x)[1]) > 0]

mlist[map(mlist, ~dim(.)[1]) > 0]

相关问题