Ответ 1
[
ожидает вектор, поэтому используйте unlist
на cond
:
l[unlist(cond)]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
Как я могу подмножить список на основе условия (TRUE, FALSE) в другом списке? Пожалуйста, смотрите мой пример ниже:
l <- list(a=c(1,2,3), b=c(4,5,6,5), c=c(3,4,5,6))
l
$a
[1] 1 2 3
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
cond <- lapply(l, function(x) length(x) > 3)
cond
$a
[1] FALSE
$b
[1] TRUE
$c
[1] TRUE
> l[cond]
Ошибка в l [cond]: недопустимый индексный тип 'list'
[
ожидает вектор, поэтому используйте unlist
на cond
:
l[unlist(cond)]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
Другой способ - использовать sapply
вместо lapply
.
cond <- sapply(l, function(x) length(x) > 3)
l[cond]
Вот что сделала функция Filter
для:
Filter(function(x) length(x) > 3, l)
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
> l[as.logical(cond)]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
cond <- lapply(l, length) > 3
l[cond]
Недавно я узнал lengths()
, который получает длину каждого элемента списка. Это позволяет нам избегать создания другого списка, включая логические значения, которые пытались выполнить OP.
lengths(l)
#a b c
#3 4 4
Используя это в логическом состоянии, мы можем подмножить элементы списка в l
.
l[lengths(l) > 3]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6