我有一个矩阵:
mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
并且我应用以下函数来过滤掉只有正条目的列,但对于具有否定条目的列,我得到NULL
。如何从NULL
,lapply
和apply
的输出中抑制sapply
?
> 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
感谢您的帮助。
答案 0 :(得分:8)
怎么样
dd <- as.data.frame(mat)
dd[sapply(dd,function(x) all(x>=0))]
?
sapply(...)
返回一个逻辑向量(在本例中为TRUE TRUE FALSE TRUE
),指出列是否具有所有非负值。或者
dd[apply(mat>=0,2,all)]
在这种情况下,我们在原始矩阵上使用apply(...,2,...)
来生成逻辑索引向量。
或
mat[,apply(mat>=0,2,all)]
在这种情况下,由于我们正在为矩阵编制索引,因此我们使用[,logical_vector]
来选择列。
答案 1 :(得分:7)
另一个选择是storyboard
Filter
Negate
NULL
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
SELECT
1 as test1, 2 as test2, 3 as test3,
fn_result(test1, test2, test3)[0] as result1,
fn_result(test1, test2, test3)[1] as result2,
fn_result(test1, test2, test3)[2] as result3
FUNCTION fn_result(val1, val2, val3)
RETURN (val1 + val2, val2 + val3, val1 + val3)
.blueimp-gallery{
position:fixed;
top:50%;
left:50%;
width:80%; /* adjust as per your needs */
height:80%; /* adjust as per your needs */
margin-left:-40%; /* negative half of width above */
margin-top:-40%; /* negative half of height above */
}
{{1}}