我有一个关于在列表中索引之前和之后挑选索引的第一个非NA
值的问题。例如,在下面的列表中,values[index]
为 NA。所以我想要一个函数,它将返回一个 before index(在本例中为 3,因为 0.5 是第一个非 NA 值(和一个后索引(在本例中为 7,因为 0.3 是索引之后的第一个值,不是 NA(。
感谢您的帮助!我想我也许可以用 for 循环来做到这一点,但我试图避免这种情况。
index = 5
values=c(0.4, NA, 0.5, NA, NA, NA, 0.3 ,NA, NA, NA, 0.5, 0.3,0.5)
if
index = 5
values=c(0.4, NA, 0.5, NA, NA, NA, 0.3 ,NA, NA, NA, 0.5, 0.3,0.5)
那么您正在寻找的两个值是
max(which(!is.na(values))[which(!is.na(values))<index])
[1] 3
min(which(!is.na(values))[which(!is.na(values))>index])
[1] 7
我想你也可以在一个which
中做到这一点,例如:
#Max
which(!is.na(values) & seq_along(values) > index)[1]
#[1] 7
#Min
tail(which(!is.na(values) & seq_along(values) < index), 1)
#[1] 3
一个选项是过滤vector
以拆分为2-parts
(1:index
和index:length
(。然后从两个部分中找到第一个non-NA
,如下所示:
#Data
index = 5
values=c(0.4, NA, 0.5, NA, NA, NA, 0.3 ,NA, NA, NA, 0.5, 0.3,0.5)
#Min
max(which(!is.na(values[1:index])))
#[1] 3
#Max - which will return offset form `index`. Hence, we need to adjust it
min(which(!is.na(values[index:length(values)])))+(index-1)
#[1] 7