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

Mai*_*ura 22 r

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

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

我试过这样的事情:

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

但显然,这不起作用.我会在这一点上手动完成,但这需要永远.救命?

bre*_*onk 24

我不确定这是否正是您所要求的,但如果您想mlist在运行该功能之前减少仅包含非空数据帧,请尝试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
Run Code Online (Sandbox Code Playgroud)


Har*_*lan 14

对于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
Run Code Online (Sandbox Code Playgroud)


Ron*_*hah 7

而不是dim(x)[1]你可以利用nrow,所以你可以做

mlist[sapply(mlist, nrow) > 0]

Filter(function(x) nrow(x) > 0, mlist)
Run Code Online (Sandbox Code Playgroud)

你也可以使用keepdiscardpurrr

purrr::keep(mlist, ~nrow(.) > 0)
purrr::discard(mlist, ~nrow(.) == 0)
Run Code Online (Sandbox Code Playgroud)

也有compactpurrr其中直接删除所有空元素。它是一个包装discard

purrr::compact(mlist)
Run Code Online (Sandbox Code Playgroud)

如果您可以根据列数过滤列表,则可以替换nrowncol上述答案。此外,您还可以使用lengths过滤列表。

mlist[lengths(mlist) > 0]
Run Code Online (Sandbox Code Playgroud)