Подать заявку, sapply и lappy return NULL
У меня есть матрица:
mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
и я применяю следующие функции для фильтрации столбцов с положительными позициями, но для столбцов с отрицательными элементами я получаю a 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
Спасибо за любую помощь.
Ответы
Ответ 1
Как насчет
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]
для выбора столбцов.
Ответ 2
Другим вариантом является Filter
ваш результат, если Negate
ing 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