Как посчитать NA в голове вектора? - PullRequest
0 голосов
/ 09 апреля 2019
x=c(NA, 2, -3, NA, -5, 5, -7, -8, -9, -10, NA, -2, 2, -14, -15, NA, -17, 2, NA, -20)

Я хотел бы выбрать первые 10 значений, которые не NA. так что я делаю:

head(x[!is.na(x)], 10)

Теперь я хочу знать, сколько NA было проигнорировано:

sum(is.na(head(x[is.na(x)], 10)))
# [1] 5

что не правильно: должно быть 3

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Нам нужен вектор логики для подмножества фактического вектора, а не только для данных NA

sum(is.na(head(x, 10)))
#[1] 3

head(x[is.na(x)], 10)
#[1] NA NA NA NA NA

дает только NA, поскольку мы поднастроим элементы NA

Обновление

Исходя из логики в комментариях, одним из способов является

i1 <- !is.na(x)
i1[i1] <- seq_along(i1[i1])
sum(is.na(head(x, which(i1 == 10))))
2 голосов
/ 09 апреля 2019

Это должно сделать это:

sum(is.na(head(x, which(cumsum(!is.na(x)) == 10))))

cumsum логического вектора, заданного !is.na, дает нам индекс десятого не- NA числа, которое является входом, который мы хотим для функции head (потому что мы хотим, чтобы все значения до мы добираемся до десятого (не NA значения).

...