2010-07-16 37 views
14

我有幾十個列表,每個列表都是11個數據幀的集合。有些數據框是空的(另一個腳本沒有輸出任何數據,也沒有錯誤)。如何從列表中刪除空的數據框?

我需要通過一個函數來推送每個列表,但當它看到一個空的數據框時就會窒息。那麼,我該如何編寫一個函數來獲取列表,在每個元素(即數據框)上做一個模糊處理,如果它是0,則跳到下一個。

我想是這樣的:

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

但顯然,沒有工作。我會在這一點上手動做到這一點,但這將需要永遠。幫幫我?

回答

16

我不知道這是否是你問什麼了,但如果你要修剪下來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 
+0

正是我想要的。非常感謝! – Maiasaura 2010-07-16 02:59:52

+0

我也使用lapply,我沒有意識到返回相同的長度... – Maiasaura 2010-07-16 03:02:31

+0

嵌套列表呢?我需要循環嗎? – Bonono 2016-10-12 16:18:29

11

稍微更簡單,更透明的方法來sapply /索引組合使用的過濾器()函數:

> 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 
+0

任何想法可能會更好的表現? – TMOTTM 2015-08-02 21:32:43

+0

@TMOTTM,我認爲他們應該幾乎完全一樣。 (但試試吧,如果不是,請告訴我們!) – Harlan 2015-08-03 22:00:30

+0

'nrow(x)> 0'而不是'dim(x)[1]> 0'。少就是多 – Tunn 2016-09-15 14:58:16