2017-02-24 3 views
3

を埋めるために、リストの要素を下にコピーします。私は前の要素の内容とNAを含むされていないリスト要素を下にコピーする方法を見つけるしたいと思い、私は今は、NAのリスト要素に以下

set.seed(20) 
test_list <- list("1" = matrix(rnorm(100), 10, 10), 
        "2" = NA, 
        "3" = NA, 
        "4" = NA, 
        "5" = NA, 
        "6" = matrix(rnorm(100), 10, 10), 
        "7" = NA, 
        "8" = NA) 

を持っているコードです要素1-5は要素1の行列を含み、6-8は要素6の行列を含みます。コピーする要素としてNaを使用せずにこの問題を設定できます(if NULLなどを使用すると、その解決に役立ちます)。

アドバイスをいただきありがとうございます。

答えて

3

あなたはaccumulateモード(非常に大きなデータを上に動作しない場合があります)とReduce機能を使用することができます扱うことができる

str(test_list) 
#List of 8 
# $ 1: num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ 2: logi NA 
# $ 3: logi NA 
# $ 4: logi NA 
# $ 5: logi NA 
# $ 6: num [1:10, 1:10] 0.548 -0.226 1.217 0.701 0.912 ... 
# $ 7: logi NA 
# $ 8: logi NA 


fill_list <- Reduce(function(x, y) if(all(is.na(y))) x else y, test_list, acc = TRUE) 

str(fill_list) 
#List of 8 
# $ : num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ : num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ : num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ : num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ : num [1:10, 1:10] 1.163 -0.586 1.785 -1.333 -0.447 ... 
# $ : num [1:10, 1:10] 0.548 -0.226 1.217 0.701 0.912 ... 
# $ : num [1:10, 1:10] 0.548 -0.226 1.217 0.701 0.912 ... 
# $ : num [1:10, 1:10] 0.548 -0.226 1.217 0.701 0.912 ... 
+0

本当にエレガントな解決策だったこと、ありがとうございました。それは少なくとも数千要素のためにかなり速く働く。 –

+0

ようこそ。本当にうれしい! – Psidom

5

is.na「リスト」の丁度、道はここneeeded、中:の場合のリターンTRUENA単一:それはすべての要素をチェック避けるよう

is.na(test_list) 
# 1  2  3  4  5  6  7  8 
#FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE 

is.naのこの動作は、また、「リスト」の効率的にテストを行いwith(length!= 1)。このオフNA LOCF機能の構築

cummax((!is.na(test_list)) * seq_along(test_list)) 
#1 2 3 4 5 6 7 8 
#1 1 1 1 1 6 6 6 

我々はtest_listのサブセット:

test_list[cummax((!is.na(test_list)) * seq_along(test_list))] 
+0

これはとても楽しいです。しかし、名前をリセットする必要があります。 –

+0

@RichScriven:is.na(list(NA、c(NA、NA)))に対して 'c(TRUE、FALSE)'を返す機能の使用例を考えてはいけません。あなたは "名前"について正しいのですが、どの要素が引き継がれたかの情報が役に立つ場合に備えて、私はそのまま残しました。 –

関連する問題