2017-03-01 24 views
0

我想知道如何識別list的對象與>1 rowsR如何在R中識別大於1行的列表對象?

爲例假設我們有以下list

c = 6:10 
d = 1:5 
f = 11:15 

output <- list(var1 = rbind(c,d,f), var2 = c, var3 = rbind(d,f)) 
output 

$var1 
    [,1] [,2] [,3] [,4] [,5] 
c 6 7 8 9 10 
d 1 2 3 4 5 
f 11 12 13 14 15 

$var2 
[1] 6 7 8 9 10 

$var3 
    [,1] [,2] [,3] [,4] [,5] 
d 1 2 3 4 5 
f 11 12 13 14 15 

的預期是有一個文件列出或提供的object名稱以> 1row如下:

output2 
$var1 
    [,1] [,2] [,3] [,4] [,5] 
c 6 7 8 9 10 
d 1 2 3 4 5 
f 11 12 13 14 15 

$var3 
    [,1] [,2] [,3] [,4] [,5] 
d 1 2 3 4 5 
f 11 12 13 14 15 

output2 
[1] var1, var3 

預先感謝您的解釋幫助!

回答

2

你可以用做此sapplydim,IsTrue運算,和在基礎R [

output[sapply(output, function(i) isTRUE(dim(i)[1] > 1))] 
$var1 
    [,1] [,2] [,3] [,4] [,5] 
c 6 7 8 9 10 
d 1 2 3 4 5 
f 11 12 13 14 15 

$var3 
    [,1] [,2] [,3] [,4] [,5] 
d 1 2 3 4 5 
f 11 12 13 14 15 

sapply貫穿每個對象並檢查行維度,的dim第一元件,大於1。但是,由於向量和其他對象(例如列表)沒有維度屬性,此檢查返回logical(0)。爲了強制FALSE,我們將輸出包裝在isTRUE中。從sapply產生的邏輯向量用於列表子集。

+0

@Imo很聰明!謝謝你的解釋 ! :) – Daniel

1

這裏是另一個想法:

c = t(6:10) 
d = t(1:5) 
f = t(11:15) 

output <- list(var1 = rbind(c,d,f), var2 = c, var3 = rbind(d,f)) 
output 

nrow(as.data.frame(output[1]))>1 
nrow(as.data.frame(output[2]))>1 
nrow(as.data.frame(output[3]))>1 

f <- function(x) nrow(as.data.frame(x))>1 
sapply(output, f) 
which(sapply(output, f)) 

我認爲你需要採取原來這裏向量的轉置函數T(),以確保它們被看作是一個行與多列,而不是許多列一行。

1

有可能很多方法可以做到這一點,但是這應該工作:

output2 <- names(which(unlist(purrr::map(output, ~nrow(.x)>1))==TRUE))

+0

可能你需要修改你的答案,導致你的腳本的結果不是想要的; – Daniel

+0

哦,這是奇怪的,當我運行它我的輸出'「var1」「var3」'它爲你輸出了什麼? – Lucy

+0

我得到所有三個「變種」! – Daniel

1

purrr一個優雅的解決方案:

library(purrr)  
keep(output, ~ (nrow(.) %||% 1) > 1) 

NULL值可能會出現(並出現在你的榜樣)當我們將nrow應用於一維物體時。因此,這%||% 1在這裏與1

還是有點更像@改性活生物體的辦法來取代空值:

keep(output, ~ isTRUE(nrow(.) > 1))