web-dev-qa-db-ja.com

Rのリストから値をフィルタリングする

名前付き数値のリストの平均を計算したい。最初に削除したいnumeric(0)値があります。また、リストのどの要素にnumeric(0)値が含まれるかを取得したいと思います。

値の例を次に示します。

>r["gg",]

$`01_1_er`
   gg 
0.5176445 

$`02_1_er`
   gg 
0.4990959 

$`03_1_er`
   gg 
0.5691489 

$`22_1_er`
numeric(0)

$`23_1_er`
numeric(0)

$`25_1_er`
  gg 
0.386304 

そしてこれがstrの結果です:

> str(r["gg",])
List of 6
 $ 01_1_er: Named num 0.518
  ..- attr(*, "names")= chr "gg"
 $ 02_1_er: Named num 0.499
  ..- attr(*, "names")= chr "gg"
 $ 03_1_er: Named num 0.569
  ..- attr(*, "names")= chr "gg"
 $ 22_1_er: num(0) 
 $ 23_1_er: num(0) 
 $ 25_1_er: Named num 0.386
  ..- attr(*, "names")= chr "gg"

誰か助けてもらえますか?

11
chriga
## Example list

l <- list(n1=numeric(0), n2="foo", n3=numeric(0), n4=1:5)

## Filter out elements with length 0

l[lapply(l, length) > 0]


$n2
[1] "foo"

$n4
[1] 1 2 3 4 5


## Get names of elements with length 0

names(l)[lapply(l, length) == 0]

[1] "n1" "n3"
27
juba

ベースRの Filter 関数を使用した別のソリューション:

mean(unlist(Filter(is.numeric, l)))
12
Ramnath

リストから外すと、数値のエントリだけが1つのベクトルに抽出されます。これは、平均を呼び出すことができるため、次のように試してください。

mean(unlist(r["gg",]))
2
James