次のような行列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を削除する良い方法はありますか?
確かに、次のように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
サンプルデータ:
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)))
あなたはこれを行うことができます:
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))