下面是我现在的代码
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)我想找到一种方法,将不包含安娜的列表元素与前面的元素内容一起复制,以便每个list元素都被填充。元素1-5将包含元素1中的矩阵,6-8将包含元素6中的矩阵。我可以在不使用NAs作为应该复制的元素的情况下设置这个问题(如果使用NULL或其他类似的方法可以帮助解决问题)。
提前感谢您的任何建议。
发布于 2017-02-24 16:23:57
您可以在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 ...发布于 2017-02-24 17:48:22
is.na可以处理“list”,确切地说,这里需要的方式是:在单个NA的情况下返回TRUE
is.na(test_list)
# 1 2 3 4 5 6 7 8
#FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUEis.na的这种行为也使得对“list”的测试非常有效,因为它避免了使用(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))]https://stackoverflow.com/questions/42443386
复制相似问题