web-dev-qa-db-fra.com

Sous-éléments d'une liste en fonction d'une condition logique

Comment puis-je sous-définir une liste en fonction d'une condition (VRAI, FAUX) dans une autre liste? S'il vous plaît, voir mon exemple ci-dessous:

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]

Erreur dans l [cond]: type 'liste' invalide

24
jrara

[ attend un vecteur, utilisez donc unlist sur cond:

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

$c
[1] 3 4 5 6
14
James

Une autre méthode consiste à utiliser sapply au lieu de lapply.

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

Voici pourquoi la fonction Filter a été créée:

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

$c
[1] 3 4 5 6
21
Jason Morgan
> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
4
NPE

J'ai récemment appris lengths(), qui obtient la longueur de chaque élément d'une liste. Cela nous permet d’éviter de créer une autre liste comprenant des valeurs logiques lors de l’essai du PO.

lengths(l)
#a b c 
#3 4 4 

En utilisant ceci dans une condition logique, nous pouvons sous-définir des éléments de liste dans l.

l[lengths(l) > 3]

$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
0
jazzurro
cond <- lapply(l, length) > 3
l[cond]
0
Andre Elrico