删除长度为0的嵌套列表

时间:2019-02-19 22:22:02

标签: r

我在R中有一个列表列表。我想删除长度为零的列表。

到目前为止,我尝试过的是:

for (i in 1:length(test)) {
  keep <- rep(T, length(test))
  for (j in 1:length(test[[i]])) {
    if (length(test[[i]][[j]]) == 0) {
      keep[[j]] <- F
    }
  }
  test2[i] <- test2[i][keep]
}

以下是一些示例数据(已编辑):

test <- list("Section 1" = list("A" = list(), "B" = list("1x1" = "23", "1x2" = "24"), C = list("2x1" = "78")),
         "Section 2" = list("A" = list(), "B" = list("1x1" = "23", "1x2" = "24"), C = list("2x1" = "78")))

我想删除第1节和第2节中的“ A”列表的方法,因为它们的长度均为0

3 个答案:

答案 0 :(得分:1)

只需整理一下内容,按照我之前的评论,您可以做

*

或更短(感谢@Parfait)

Filter(function(x) length(x) > 0, test)
#$B
#$B$`1x1`
#[1] "23"
#
#$B$`1x2`
#[1] "24"
#
#
#$C
#$C$`2x1`
#[1] "78"

对于嵌套的Filter(length, test)

list

答案 1 :(得分:1)

您可以编写自己的函数:

check = function(x){
  m = lengths(x)>0
  if(is.list(x[m])) lapply(x[m],check) else x
 }

check(test)
$`Section 1`
$`Section 1`$`B`
$`Section 1`$`B`$`1x1`
[1] "23"

$`Section 1`$`B`$`1x2`
[1] "24"


$`Section 1`$C
$`Section 1`$C$`2x1`
[1] "78"



$`Section 2`
$`Section 2`$`B`
$`Section 2`$`B`$`1x1`
[1] "23"

$`Section 2`$`B`$`1x2`
[1] "24"


$`Section 2`$C
$`Section 2`$C$`2x1`
[1] "78"

答案 2 :(得分:0)

声明这是重复项还需要额外的知识,即仅包含NULL项的列表的长度为0。还需要假设NULLlist()是等效的。尽管使用sapply(list(a=NULL), length)测试该命题表明是第一种情况,但这两个都不一定很明显。但是,第二种情况并非如此。测试:identical(NULL, list())返回FALSE,identical(list(NULL), list())is.null( list() )也返回。

莫里斯·埃弗斯(Maurits Evers)的回答应该成功。这也将成功:

 test <- test[ sapply(test, length) >0] # `sapply will return a logical vector

> test
$B
$B$`1x1`
[1] "23"

$B$`1x2`
[1] "24"


$C
$C$`2x1`
[1] "78"