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

我有几十个列表,每个都是11个数据帧的集合,

那么如何编写一个列表函数,对每个元素进行处理(即,数据帧)如果它是0,那么跳到下一个。

我尝试了这样的方法:


empties <- function (mlist)


{


 for(i in 1:length(mlist))


 {


 if(dim(mlist[[i]])[1]!=0) return (mlist[[i]])


 }


}



时间:

我不确定这是否正确,但是如果你想要在运行函数之前仅包含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



对于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



添加tidyverse选项:


library(tidyverse)


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



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



你可以使用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)



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


mlist[lengths(mlist) > 0]



...