apply,sapply和lappy返回NULL

时间:2015-04-28 21:10:54

标签: r apply lapply sapply

我有一个矩阵:

mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)

并且我应用以下函数来过滤掉只有正条目的列,但对于具有否定条目的列,我得到NULL。如何从NULLlapplyapply的输出中抑制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

感谢您的帮助。

2 个答案:

答案 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}}