我有一个问题,一个向量在开始时有一堆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)
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)
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)