Какой самый элегантный способ проверить наличие отсутствующих данных в R? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть набор чисел c векторов в R каждой длины 16. Я хотел бы выбрать те векторы, у которых все значения представлены в одном из четырех положений: 1: 4, 5: 8, 9:12, 13 : 16

например, вектор c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA) пройдет тест, поскольку все позиции 5: 8 не являются NA.

Что является наиболее элегантным (то есть с использованием минимального легко читаемого кода) способ проверить это?

Ответы [ 3 ]

3 голосов
/ 15 марта 2020

Имея список индексов, вы можете перебирать эти диапазоны и искать без каких-либо NA:

vec <- c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)
sapply(list(1:4, 5:8, 9:12, 13:16),
       function(ind) !anyNA(vec[ind]))
# [1] FALSE  TRUE FALSE FALSE

Если вы хотите вернуть значения в этих индексах:

inds <- list(1:4, 5:8, 9:12, 13:16)
good <- sapply(inds, function(ind) !anyNA(vec[ind]))
# should check that `any(good)` is true
inds[[ which(good)[1] ]]
# [1] 5 6 7 8
vec[ inds[[ which(good)[1] ]] ]
# [1] 1 1 1 1
2 голосов
/ 15 марта 2020

Здесь есть опция с rleid для получения идентификатора кодировки длины серии вектора, используйте его в качестве переменной группировки, чтобы проверить, есть ли у какой-либо последовательности полный набор элементов, отличных от NA

library(data.table)
any(as.logical(ave(seq_along(v1) * v1, rleid(v1),
         FUN = function(x) all(!is.na(x))) ))
#[1] TRUE

Или это может быть также

any(with(rle(!is.na(v1)), lengths[values] >=4))
#[1] TRUE

Или другой вариант table

4 %in% table(v1 * (seq_along(v1) -1) %/% 4)
#[1] TRUE

data

v1 <- c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)
0 голосов
/ 15 марта 2020

Следующий код вернет одно значение (TRUE или FALSE). Возвращает TRUE, если вектор прошел тест.

vec <- c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)

!all(tapply(vec, rep(1:length(vec), each = 4, len = length(vec)), anyNA))
# [1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...