Подмножество элементов в списке на основе логического условия - PullRequest
28 голосов
/ 04 августа 2011

Как я могу создать список на основе условия (ИСТИНА, ЛОЖЬ) в другом списке? Пожалуйста, смотрите мой пример ниже:

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'

Ответы [ 6 ]

26 голосов
/ 20 января 2012

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

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

$c
[1] 3 4 5 6
23 голосов
/ 04 августа 2011

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

cond <- sapply(l, function(x) length(x) > 3)
l[cond]
17 голосов
/ 04 августа 2011

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

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

$c
[1] 3 4 5 6
4 голосов
/ 04 августа 2011
> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
0 голосов
/ 05 января 2018

Я недавно узнал 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
0 голосов
/ 09 октября 2017
cond <- lapply(l, length) > 3
l[cond]
...