R - 列表列表 - 选择无空列表

时间:2018-03-30 14:08:38

标签: r list for-loop

我在R中尝试了一些搜索和数据分析。我有这样的代码:

data = matrix( 
  c(3, 21, 80, 208,
    3, 49, 80, 1298,
    5, 17, 80, 302,
    8, 28, 80, 2857,
    13, 08, 80, 2860,
    14, 08, 80, 2860,
    15, 58, 80, 208,
    15, 58, 80, 463,
    15, 58, 80, 2065,
    15, 58, 80, 2065,
    13, 05, 80, 608,
    13, 08, 80, 608
     ), 

  nrow=12,             
  ncol=4,              
  byrow = TRUE)        

#find a match with numbers 13 and 8 in column 1
require(AhoCorasickTrie)
keywords = c("13","8 ")
SearchNew = AhoCorasickSearch(keywords,data[,1])

SearchNew看起来像那样:

> SearchNew
[[1]]
list()

[[2]]
list()

[[3]]
list()

[[4]]
list()

[[5]]
[[5]][[1]]
[[5]][[1]]$Keyword
[1] "13"

[[5]][[1]]$Offset
[1] 1

[[6]]
list()

[[7]]
list()

[[8]]
list()

[[9]]
list()

[[10]]
list()

[[11]]
[[11]][[1]]
[[11]][[1]]$Keyword
[1] "13"

[[11]][[1]]$Offset
[1] 1

[[12]]
[[12]][[1]]
[[12]][[1]]$Keyword
[1] "13"

[[12]][[1]]$Offset
[1] 1

我想要的是列表不为空的行的索引。这意味着在这种情况下它将是5,11,12。我尝试这样做:

xyz <- vector('list', length(SearchNew))
for(i in seq_along(SearchNew)){
  for(j in seq_along(SearchNew[[i]])){
    if (length(SearchNew[[i]]) > 0)
      xyz <- i 
  }
}

但是这给了我很多NULL行的矩阵。我不能给xyz只有3行,因为我不知道有多少非空行将在列表中。我是R的新人,所以我不知道如何解决这个问题。有帮助吗?

1 个答案:

答案 0 :(得分:3)

我们可以使用lengths查找非零length

元素的索引
which(lengths(SearchNew)!=0)
#[1]  5 11 12

如果我们需要对这些元素进行子集化,请使用Filter

Filter(length, SearchNew)