2011-08-04 8 views
22

¿Cómo puedo subconjuntar una lista basada en una condición (VERDADERO, FALSO) en otra lista? Por favor, vea mi ejemplo a continuación:Elementos del subconjunto en una lista basada en una condición lógica

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] 

error en l [cond]: inválido tipo subíndice 'lista'

Respuesta

11

[ está esperando un vector, por lo que utilizar unlist en cond:

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

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

$c 
[1] 3 4 5 6 
20

Otra forma es utilizar en lugar sapply de lapply.

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

Esto produce solo el objeto cond, el resultado del subconjunto. – jrara

+0

Para aclarar, l [cond] ahora produce el subconjunto ya que regresa sapidamente un vector. Editado para agregar esto. – PatrickR

17

Esto es lo que se hizo la función Filter para:

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

$c 
[1] 3 4 5 6 
+0

Simple. Base R. ¡Me encanta! – CephBirk

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

Hace poco supe lengths(), que obtiene la longitud de cada elemento de una lista. Esto nos permite evitar hacer otra lista que incluya valores lógicos como lo intentó el OP.

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

El uso de este en una condición lógica, podemos subconjunto de elementos de la lista en l.

l[lengths(l) > 3] 

$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 
Cuestiones relacionadas