我有几十个列表,每个列表都包含11个数据帧。有些数据框是空的(另一个脚本没有输出任何数据,而不是错误)。
我需要通过一个函数推送每个列表,但是当它看到一个空的数据帧时会发出窒息。那么我该如何编写一个列表的函数,对每个元素(即数据帧)进行调暗,如果为0,则跳到下一个。
我试过这样的事情:
empties <- function (mlist)
{
for(i in 1:length(mlist))
{
if(dim(mlist[[i]])[1]!=0) return (mlist[[i]])
}
}
但显然,这不起作用。我会在这一点上手动完成,但这需要永远。帮助
答案 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
中的discard
和purrr
purrr::keep(mlist, ~nrow(.) > 0)
purrr::discard(mlist, ~nrow(.) == 0)
compact
中还有purrr
,可直接删除所有空元素。它是discard
purrr::compact(mlist)
如果可以根据列数过滤列表,则可以在以上答案中将nrow
替换为ncol
。此外,您还可以使用lengths
来过滤列表。
mlist[lengths(mlist) > 0]