web-dev-qa-db-ja.com

論理条件に基づくリストのサブセット要素

別のリストの条件(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'が無効です

32
jrara

[はベクトルを想定しているため、unlistcondを使用します。

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

$c
[1] 3 4 5 6
17
James

これは、Filter関数が作成されたものです。

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

$c
[1] 3 4 5 6
30
Jason Morgan

もう1つの方法は、sapplyの代わりにlapplyを使用することです。

cond <- sapply(l, function(x) length(x) > 3)
l[cond]
23
PatrickR
> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
4
NPE

私は最近、リストの各要素の長さを取得する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
jazzurro
cond <- lapply(l, length) > 3
l[cond]
0
Andre Elrico