在第一个NA出现后删除列表列表中的所有列表位置(R)

问题描述 投票:0回答:1

我有一个包含所有整数的嵌套列表(或列表列表)。一些嵌套列表的NA值是从嵌套列表中的某个位置随机分配的。在第一个NA出现后,我需要删除嵌套列表中的所有位置。

[例如,在下面的5个嵌套列表的列表中,L.miss的示例数据中,位置L.miss[[2]]是九个长度可变的整数的向量的列表。第一个NA出现在位置L.miss[[2]][[4]][3]上,因此any(is.na(L.miss[[2]][[4]]))返回TRUE。在我想要的输出中,需要删除位置L.miss[[2]][4:9]。列表L.want是所需的结果。

L.miss <- list(list(1,3,c(0,2,0),c(NA)),
             list(1,6,c(0,3,2,0,1,0),c(0,0,NA,1,0,0),1,2,c(NA,1),2,c(0,0)),
             list(1,0),
             list(1,0),
             list(1,4,c(2,0,0,0),c(4,1),c(1,NA,0,0,0),0),
             list(1,0))

L.want <- list(list(1,3,c(0,2,0)),
             list(1,6,c(0,3,2,0,1,0)),
             list(1,0),
             list(1,0),
             list(1,4,c(2,0,0,0),c(4,1),
             list(1,0))

我的尝试是遍历列表位置并分配一个NULL值:

try <- L.miss 
for (i in 1:length(try)){
  for (k in 1:length(try[[i]])){
    if (any(is.na(try[[i]][[k]]))){
      try[[i]][k:length(try[[i]])] <- NULL
    }
  }
}

但是这会返回错误:Error in try1[[i]][[k]] : subscript out of bounds

我假设这是因为它在嵌套列表的整个长度上启动了k for循环,然后删除了一个元素,所以现在越界了,但是尽管有一个详尽的搜索。

任何建议都值得赞赏!

r list nested-loops
1个回答
1
投票

这是一种方式:

out_list <- lapply(L.miss, function(x) {
               inds <- sapply(x, function(x) any(is.na(x)))
               if(any(inds)) x[seq_len(which.max(inds) - 1)] else x
             })

out_list[[2]]
#[[1]]
#[1] 1

#[[2]]
#[1] 6

#[[3]]
#[1] 0 3 2 0 1 0
© www.soinside.com 2019 - 2024. All rights reserved.