Найдите положение индекса первого значения не-NA в векторе R? - программирование

Найдите положение индекса первого значения не-NA в векторе R?

У меня есть проблема, когда в начале вектор вектор имеет пучок NA, а затем данные. Однако особенностью моих данных является то, что первые n значений, которые не являются NA, вероятно, ненадежны, поэтому я хотел бы удалить их и заменить их NA.

Например, если у меня есть вектор длиной 20, а не-NA начинаются с позиции индекса 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

Я хотел бы удалить первые 3 значения не-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

Конечно, мне нужно общее решение, и я никогда не знаю, когда начнется первое значение, отличное от NA. Как мне это сделать? IE Как узнать положение индекса первого значения, отличного от NA?

Для полноты мои данные фактически расположены в кадре данных с большим количеством этих векторов в столбцах, и каждый вектор может иметь другую начальную позицию, отличную от NA. Также, как только данные начинаются, могут появляться спорадические NAs вниз, что мешает мне просто подсчитать их число в качестве решения.

4b9b3361

Ответ 1

Используйте комбинацию 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)

Ответ 2

Аналогичная идея для @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))

который дает:

> (start <- which.min(is.na(dat)))
[1] 4

Используйте это, чтобы установить start:(start+2) в NA

is.na(dat) <- seq(start, length.out = 3)

в результате:

> dat
 [1]         NA         NA         NA         NA         NA
 [6]         NA 0.94467527 0.66079779 0.62911404 0.06178627

Ответ 3

При работе с большими данными Position значительно быстрее, чем which, потому что он вычисляет только до тех пор, пока не будет найдено совпадение, а не оценивает весь вектор.

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

Мы можем присвоить NA следующим значениям N (или концу вектора, в зависимости от того, что наступит раньше) с помощью

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

Ответ 4

Я сделал бы это что-то вроде строк

# generate some data
tb <- runif(10)
tb[1:3] <- NA

# I convert vector to TRUE/FALSE based on whether it NA or not
# rle function will tell you when something "changes" in the vector
# (in our case from TRUE to FALSE)
tb.rle <- rle(is.na(tb))

# this is where vector goes from all TRUE to (at least one) FALSE
# your first true number is one position ahead, so +1
tb.rle$lengths[1] 

# you can now subset your vector with the first non-NA value
# and do with it whatever you want. I assign it a fantastic 
# non-believable number
tb[tb.rle$lengths[1] + 1] <- 42

Ответ 5

na.trim() в пакете zoo может помочь.

library(zoo)
dummy.data <- c(rep(NA, 5), seq(1:7), NA)
x <- length(dummy.data) - length(na.trim(dummy.data, sides = "left"))
dummy.data[(x+1):(x+3)] <- NA
dummy.data
[1] NA NA NA NA NA NA NA NA  4  5  6  7 NA

Ответ 6

Вы также можете напрямую использовать функцию replace(), я знаю, что ответ уже есть, но как replace() слишком хорош для такого рода вещей

Для Example-:

A <- c(1,2,3,4,5,NA,58,NA,98,NA,NA,NA)
which(is.na(A))
A <- replace(A,1:3,NA)

Ответ 7

Вот самый простой способ найти позиции элементов NA

# 1. Data with NA
x <- c(1:6, NA, NA, 9:12)

# 2. Position of NA elements
seq(along = x)[is.na(x)]
which(is.na(x))

ОБНОВЛЕНИЕ ОП:

нужен!

мин (что (! is.na (х)))