【问题标题】:Remove all lists positions in list of lists after first NA appears (R)在第一个 NA 出现后删除列表列表中的所有列表位置 (R)
【发布时间】:2020-05-08 04:17:41
【问题描述】:

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

例如,在我下面的 5 个嵌套列表列表的示例数据中,L.miss,位置 L.miss[[2]] 是一个由 9 个不同长度的整数向量组成的列表。第一个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】:

    这是一种方法:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2011-05-11
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多