我在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
答案 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。还需要假设NULL
和list()
是等效的。尽管使用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"