【问题标题】:Get index and value of non-NA list element获取非 NA 列表元素的索引和值
【发布时间】:2021-11-07 17:02:51
【问题描述】:

获取类似as.list(rep(c(NA, 4, NA), times = c(5, 1, 2))) 的列表,即

[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] NA

[[4]]
[1] NA

[[5]]
[1] NA

[[6]] # index of non-NA list element, 6
[1] 4 # ...and its corresponding value, 4 

[[7]]
[1] NA

[[8]]
[1] NA

我想提取非NA元素的索引(这里:6),以及它对应的值(这里:4)。有没有什么惯用的方法可以得到这两个数字?

【问题讨论】:

  • 每个列表元素是否总是长度为 1 的向量?
  • @Henrik 我很高兴同意。
  • 好的,然后可能是cbind(ix <- which(!is.na(l)), l[[ix]])(其他答案中已经使用了各个部分)。
  • @Henrik,即使现在可行,它也可能在未来失败,因为不能保证按顺序评估参数。为了安全起见,ix<- ... 部分应单独声明。

标签: r list subset na


【解决方案1】:

使用stack

na.omit(stack(setNames(L, seq_along(L))))
  values ind
6      4   6

【讨论】:

    【解决方案2】:

    1) Base R 假设列表 L 仅包含标量和 NA,这将返回一个 2 列矩阵,其中每组 xy 坐标有一行,以及记录哪些位置被省略的属性。 p>

    如果您不需要列名,请忽略 x=y=。如果您不希望属性记录 NA 的位置,请将 [,] 附加到行尾。如果您知道只有一个标量,您可能希望将其包装在 c(...) 中以生成 2 元素向量。如果您更喜欢数据框输出,请将 cbind 替换为 data.frame

    na.omit(cbind(x = seq_along(L), y = unlist(L)))
    

    2) tidyverse 或使用 tidyverse

    library(tibble)
    library(tidyr)
    
    drop_na(enframe(unlist(L)))
    

    2a) 可以使用这样的管道交替编写:

    L %>% unlist %>% enframe %>% drop_na
    

    【讨论】:

      【解决方案3】:
      1. 找到非NA列表的索引== 6得到x
      2. 删除所有带有NA的列表元素得到y
      my_list <- as.list(rep(c(NA, 4, NA), times = c(5, 1, 2)))
      
      
      x <- which(!is.na(my_list))
      y <- unlist(Filter(function(a) any(!is.na(a)), my_list))
      coordinate <- c(x,y)
      coordinate
      
      > coordinate
      [1] 6 4
      

      【讨论】:

        【解决方案4】:

        我不确定这是否足够优雅但有效;

        mylist <- as.list(rep(c(NA, 4, NA), times = c(5, 1, 2)))
        
        x <- (1:length(mylist))[!sapply(mylist,is.na)]
        y <- mylist[[x]]
        
        coor <- c(x,y)
        
        coor
        

        输出;

        6 4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-05
          • 2013-12-03
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多