如何从列表中删除空数据帧?

时间:2010-07-16 02:08:41

标签: r

我有几十个列表,每个列表都包含11个数据帧。有些数据框是空的(另一个脚本没有输出任何数据,而不是错误)。

我需要通过一个函数推送每个列表,但是当它看到一个空的数据帧时会发出窒息。那么我该如何编写一个列表的函数,对每个元素(即数据帧)进行调暗,如果为0,则跳到下一个。

我试过这样的事情:

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

但显然,这不起作用。我会在这一点上手动完成,但这需要永远。帮助

4 个答案:

答案 0 :(得分:24)

我不确定这是否正是您所要求的,但是如果您希望在运行函数之前将mlist向下调整为仅包含非空数据帧,请尝试{{1 }}

E.g:

mlist[sapply(mlist, function(x) dim(x)[1]) > 0]

答案 1 :(得分:13)

对sapply / indexing组合采用稍微简单和透明的方法是使用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

答案 2 :(得分:1)

添加tidyverse选项:

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


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

答案 3 :(得分:1)

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

mlist[sapply(mlist, nrow) > 0]

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

您还可以使用keep中的discardpurrr

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

compact中还有purrr,可直接删除所有空元素。它是discard

上的包装器
purrr::compact(mlist)

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

mlist[lengths(mlist) > 0]