Получить позиции для АН только в «середине» столбца матрицы - PullRequest
6 голосов
/ 29 января 2011

Я хочу получить индекс, который ссылается на позиции значений NA в матрице, где индекс равен true, если заданная ячейка является NA, и в столбце есть по крайней мере одно значение, отличное от NA. Например, с учетом следующей матрицы

     [,1] [,2] [,3] [,4]
[1,]   NA    1   NA    1
[2,]    1   NA   NA    2
[3,]   NA    2   NA    3

единственное значение индекса, которое возвращает TRUE, должно быть [2,2].

Есть ли компактное выражение для того, что я хочу сделать? Если бы мне пришлось, я мог бы пройтись по столбцам и использовать что-то вроде min(which(!is.na(x[,i]))), чтобы найти первое не-NA значение в каждом столбце, а затем установить все значения до этого в FALSE (и то же самое для всех значений после max). Таким образом, я бы не стал выбирать начальные и конечные значения NA. Но это выглядит немного грязно, поэтому мне интересно, есть ли более чистое выражение, которое делает это без циклов.

РЕДАКТИРОВАТЬ Чтобы быть действительным, значение NA должно иметь значение, отличное от NA, до и после него где-то внутри столбца, но не обязательно рядом с ним. Например, если столбец был определен c (NA, 3, NA, NA, NA, 4, NA), то я хочу найти те NA, которые находятся в позициях 3, 4 и 5, поскольку они заключены в не-NA значения.

Ответы [ 3 ]

6 голосов
/ 29 января 2011

Не проверял это очень тщательно, но он работает на тестовом примере:

z <- matrix(c(NA,1,NA,1,NA,2,NA,NA,NA,1,2,3),ncol=4)
isNA <- is.na(z)
# Vertical index which increments at non-NA entries, counting top-to-bottom:
nonNA_idx.tb <- apply(!isNA, 2, cumsum)
# Vertical index which increments at non-NA entries, counting bottom-to-top:
nonNA_idx.bt <- apply(!isNA, 2, function(x) { rev(cumsum(rev(x))) })
which(isNA & nonNA_idx.tb>0 & nonNA_idx.bt>0, arr.ind=TRUE)

(PS - я думаю, что это довольно мило, но я пристрастен)

1 голос
/ 29 января 2011
m <- matrix(c(NA, 1, NA, 1, NA, 2, NA, NA, NA, 1, 2, 3), ncol= 4)

matmain <- is.na(m)
matprev <- rbind(FALSE, head(!matmain, -1))
matnext <- rbind(tail(!matmain, -1), FALSE)

which(matmain & (matprev | matnext), arr.ind = TRUE)

Я интерпретировал вопрос немного по-другому.Когда вы говорите «до» и «после» в колонке, подразумеваете ли вы непосредственно до и после или где-нибудь до и после?Со следующей тестовой матрицей у нас есть [2,1] [3,1] и [2,2], но как насчет [2,3]?

m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4)
0 голосов
/ 10 мая 2016

pts <- образец (c (1: 10, NA), размер = 100, замена = T) </p>

mat <- матрица (pts, ncol = 10) </p>

который (is.na (мат), arr.ind = T)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...