获取非 NA 列表元素的索引和值

Get index and value of non-NA list element

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)。有什么惯用的方法可以得到这两个数字吗?

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

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
  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

1) Base R 假设列表 L 只包含标量和 NA,这个 returns 一个 2 列矩阵,每组 xy 坐标一行,一个属性记录省略了哪些位置。

如果不需要列名,请省略 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

使用stack

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