Подтвердить что ты не робот

Элементы подмножества в списке, основанные на логическом условии

Как я могу подмножить список на основе условия (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'

4b9b3361

Ответ 1

[ ожидает вектор, поэтому используйте unlist на cond:

l[unlist(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6

Ответ 2

Другой способ - использовать sapply вместо lapply.

cond <- sapply(l, function(x) length(x) > 3)
l[cond]

Ответ 3

Вот что сделала функция Filter для:

Filter(function(x) length(x) > 3, l)
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6

Ответ 4

> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6

Ответ 5

cond <- lapply(l, length) > 3
l[cond]

Ответ 6

Недавно я узнал 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