应用、应用和 lappy return NULL
apply, sapply and lappy return NULL
我有一个矩阵:
mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
并且我应用以下函数来过滤掉只有正项的列,但是对于具有负项的列,我得到 NULL
。如何从 lapply
、apply
和 sapply
的输出中抑制 NULL
s?
> lapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 0 0
> sapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 0 0
> apply(mat, 2, function(x){if (all(x >= 0)){return(x)}})
[[1]]
[1] 0 0 0 0
[[2]]
[1] 1 1 1 1
[[3]]
NULL
[[4]]
[1] 0 0 0 0
感谢您的帮助。
怎么样
dd <- as.data.frame(mat)
dd[sapply(dd,function(x) all(x>=0))]
?
sapply(...)
returns 一个逻辑向量(在本例中为 TRUE TRUE FALSE TRUE
),它说明列是否具有所有非负值。
- 当与数据框(不是矩阵)一起使用时,使用逻辑向量的单括号索引将数据框视为列表(它是)并创建一个仅包含指定元素的列表。
或者
dd[apply(mat>=0,2,all)]
在这种情况下,我们在原始矩阵上使用 apply(...,2,...)
来生成逻辑索引向量。
或
mat[,apply(mat>=0,2,all)]
在这种情况下,因为我们正在索引矩阵,所以我们使用 [,logical_vector]
到 select 列。
另一种选择是 Filter
您的结果,同时 Negate
ing NULL
s(如果您想将其保留为列表格式)
Res <- lapply(as.data.frame(mat), function(x) if(all(x >= 0)) x)
Filter(Negate(is.null), Res)
# $V1
# [1] 0 0 0 0
#
# $V2
# [1] 1 1 1 1
#
# $V4
# [1] 0 0 0 0
我有一个矩阵:
mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
并且我应用以下函数来过滤掉只有正项的列,但是对于具有负项的列,我得到 NULL
。如何从 lapply
、apply
和 sapply
的输出中抑制 NULL
s?
> lapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 0 0
> sapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 0 0
> apply(mat, 2, function(x){if (all(x >= 0)){return(x)}})
[[1]]
[1] 0 0 0 0
[[2]]
[1] 1 1 1 1
[[3]]
NULL
[[4]]
[1] 0 0 0 0
感谢您的帮助。
怎么样
dd <- as.data.frame(mat)
dd[sapply(dd,function(x) all(x>=0))]
?
sapply(...)
returns 一个逻辑向量(在本例中为TRUE TRUE FALSE TRUE
),它说明列是否具有所有非负值。- 当与数据框(不是矩阵)一起使用时,使用逻辑向量的单括号索引将数据框视为列表(它是)并创建一个仅包含指定元素的列表。
或者
dd[apply(mat>=0,2,all)]
在这种情况下,我们在原始矩阵上使用 apply(...,2,...)
来生成逻辑索引向量。
或
mat[,apply(mat>=0,2,all)]
在这种情况下,因为我们正在索引矩阵,所以我们使用 [,logical_vector]
到 select 列。
另一种选择是 Filter
您的结果,同时 Negate
ing NULL
s(如果您想将其保留为列表格式)
Res <- lapply(as.data.frame(mat), function(x) if(all(x >= 0)) x)
Filter(Negate(is.null), Res)
# $V1
# [1] 0 0 0 0
#
# $V2
# [1] 1 1 1 1
#
# $V4
# [1] 0 0 0 0