复制列表元素以填充NA列表元素

时间:2017-02-24 16:16:51

标签: r list

以下是我现在的代码

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)

我想找到一种方法来复制不包含带有先前元素内容的NA的列表元素,以便填充每个列表元素。元素1-5将包含元素1和6中的矩阵-8将包含元素6中的矩阵。我可以设置此问题而不使用NA作为应该复制的元素(如果使用NULL或其他类似的东西有助于解决方案)。

提前感谢您的任何建议。

2 个答案:

答案 0 :(得分:5)

is.na可以完全按照这里所需的方式处理&#34;列表&#34;如果 {{1},则返回TRUE }:

NA

is.na(test_list) # 1 2 3 4 5 6 7 8 #FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE 的这种行为也会使&#34; list&#34;的测试变得高效,因为它避免使用(length!= 1)检查任何元素。

建立is.na locf功能:

NA

我们将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

答案 1 :(得分:3)

您可以在Reduce模式下使用accumulate功能(可能无法处理非常大的数据):

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 ...