以下是我现在的代码
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或其他类似的东西有助于解决方案)。
提前感谢您的任何建议。
答案 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 ...