2017-03-01 159 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))