获取非 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
- 查找非 NA 列表的索引 == 6 得到
x
- 删除所有带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
像 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
- 查找非 NA 列表的索引 == 6 得到
x
- 删除所有带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