我有一个这样的清单:
x = list(a = 1:4, b = 3:10, c = NULL)
x
#$a
#[1] 1 2 3 4
#
#$b
#[1] 3 4 5 6 7 8 9 10
#
#$c
#NULL
我希望提取所有非空元素。如何才能做到这一点?感谢。
答案 0 :(得分:34)
这是另一种选择:
Filter(Negate(is.null), x)
答案 1 :(得分:11)
怎么样:
x[!unlist(lapply(x, is.null))]
以下是对正在发生的事情的简要说明。
lapply
告诉我们哪些元素是NULL
R> lapply(x, is.null)
$a
[1] FALSE
$b
[1] FALSE
$c
[1] TRUE
接下来,我们将列表转换为向量:
R> unlist(lapply(x, is.null))
a b c
FALSE FALSE TRUE
然后我们将TRUE
切换为FALSE
:
R> !unlist(lapply(x, is.null))
a b c
TRUE TRUE FALSE
最后,我们使用通常的表示法选择元素:
x[!unlist(lapply(x, is.null))]
答案 2 :(得分:3)
x[!sapply(x,is.null)]
这概括为关于列表的任何逻辑语句,只是“is.null”逻辑中的子语句。
答案 3 :(得分:0)
比上述更简单且更快,以下适用于任何非递归(在is.recursive
)值的意义上的列表:
example_1_LST <- list(NULL, a=1.0, b=Matrix::Matrix(), c=NULL, d=4L)
example_2_LST <- as.list(unlist(example_1_LST, recursive=FALSE))
str(example_2_LST)
打印:
List of 3
$ a: num 1
$ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots
.. ..@ x : logi NA
.. ..@ Dim : int [1:2] 1 1
.. ..@ Dimnames:List of 2
.. .. ..$ : NULL
.. .. ..$ : NULL
.. ..@ uplo : chr "U"
.. ..@ factors : list()
$ d: int 4