找到R向量中第一个非NA值的索引位置?

Tho*_*wne 42 r

我有一个问题,一个向量在开始时有一堆NA,然后是数据.然而,我的数据的特点是前N个非NA的值可能不可靠,所以我想删除它们并用NA替换它们.

例如,如果我有一个长度为20的向量,并且非NAs从索引位置4开始:

> z
 [1]          NA          NA          NA -1.64801942 -0.57209233  0.65137286  0.13324344 -2.28339326
 [9]  1.29968050  0.10420776  0.54140323  0.64418164 -1.00949072 -1.16504423  1.33588892  1.63253646
[17]  2.41181291  0.38499825 -0.04869589  0.04798073
Run Code Online (Sandbox Code Playgroud)

我想删除前三个非NA值,我相信这是不可靠的,给出这个:

> z
 [1]          NA          NA          NA          NA          NA          NA  0.13324344 -2.28339326
 [9]  1.29968050  0.10420776  0.54140323  0.64418164 -1.00949072 -1.16504423  1.33588892  1.63253646
[17]  2.41181291  0.38499825 -0.04869589  0.04798073
Run Code Online (Sandbox Code Playgroud)

当然,我需要一个通用的解决方案,我永远不知道第一个非NA值何时开始.我该怎么做呢?IE如何找出第一个非NA值的索引位置?

为了完整起见,我的数据实际上被安排在一个数据帧中,其中列中有许多这些矢量,并且每个矢量可以具有不同的非NA起始位置.此外,一旦数据开始,可能会有零星的NA进一步下降,这使我无法简单地计算它们的数量,作为解决方案.

Jos*_*ich 62

使用的组合is.na,并which找到非NA索引位置.

NonNAindex <- which(!is.na(z))
firstNonNA <- min(NonNAindex)

# set the next 3 observations to NA
is.na(z) <- seq(firstNonNA, length.out=3)
Run Code Online (Sandbox Code Playgroud)

  • `firstNonNA < - NonNAindex [1]`更快?使用`[1]`vs`min()`会遇到一些问题吗? (4认同)

Rei*_*son 23

与@Joshua类似的想法,但使用 which.min()

## dummy data
set.seed(1)
dat <- runif(10)
dat[seq_len(sample(10, 1))] <- NA

## start of data
start <- which.min(is.na(dat))
Run Code Online (Sandbox Code Playgroud)

这使:

> (start <- which.min(is.na(dat)))
[1] 4
Run Code Online (Sandbox Code Playgroud)

使用此设置start:(start+2)NA

is.na(dat) <- seq(start, length.out = 3)
Run Code Online (Sandbox Code Playgroud)

导致:

> dat
 [1]         NA         NA         NA         NA         NA
 [6]         NA 0.94467527 0.66079779 0.62911404 0.06178627
Run Code Online (Sandbox Code Playgroud)

  • +1,但我不确定清洁.它更短,但对于那些没有意识到`which.min`分别将`TRUE`和'FALSE'强制转换为`1`和'0`的人来说可能不太清楚. (3认同)
  • @Joshua同意,它还依赖于.min返回任何并列最小值的第一个行为.不确定更短的值得接受. (2认同)

dww*_*dww 16

如果处理大数据,Position则速度要快得多which,因为它只会在找到匹配项之前进行求值,而不是评估整个向量.

x=c(rep(NA,3),1:1e8)
Position(function(x) !is.na(x), x)
# 4
Run Code Online (Sandbox Code Playgroud)

我们可以将NA分配给以下N值(或矢量的末尾,以先到者为准)

pos = Position(function(x)!is.na(x), x)
x[pos:min(pos+N-1, length(x))] <- NA
Run Code Online (Sandbox Code Playgroud)