web-dev-qa-db-ja.com

リストのリストからNAを削除します

次のような行列data.matがあります。

A B C D E  
45 43 45 65 23   
12 45 56 NA NA   
13 4  34 12 NA  

これをリストのリストに変換しようとしています。各行は、より大きなリスト内の1つのリストです。私は次のことをします:

list <- tapply(data.mat,rep(1:nrow(data.mat),ncol(data.mat)),function(i)i)

これにより、次のようなNAを含むリストのリストが表示されます。

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56 NA NA  
$`3`  
 [1]  13 4 34 12 NA  

しかし、私が欲しいのは:

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56   
$`3`  
 [1]  13 4 34 12   

タッピーコール中または事後にNAを削除する良い方法はありますか?

10
Amberopolis

確かに、次のようにlapplyを使用できます。

> lapply(list, function(x) x[!is.na(x)])
$`1`
[1] 45 43 45 65 23

$`2`
[1] 12 45 56

$`3`
[1] 13  4 34 12
21
rsoren

サンプルデータ:

data.mat <- data.matrix(read.table(text = "A B C D E  
45 43 45 65 23   
12 45 56 NA NA   
13 4  34 12 NA ", header = TRUE))

行ごとに分割するには:

row.list <- split(data.mat, row(data.mat))

NAを削除するには:

Map(Filter, list(Negate(is.na)), row.list)

または

lapply(row.list, Filter, f = Negate(is.na))

ワンショットですべて:

Map(Filter, list(Negate(is.na)), split(data.mat, row(data.mat)))
6
flodel

あなたはこれを行うことができます:

apply(data.mat, 1, function(x) x[!is.na(x)])

出力:

[[1]]
 A  B  C  D  E 
45 43 45 65 23 

[[2]]
 A  B  C 
12 45 56 

[[3]]
 A  B  C  D 
13  4 34 12

名前が必要ない場合:

apply(data.mat, 1, function(x) unname(x[!is.na(x)]))

すべての行に同じ数のNAがある可能性がある場合は、次のように使用する方が安全です。

split(apply(data.mat, 1, function(x) unname(x[!is.na(x)])), 1:nrow(data.mat))
3
Jota