2011-01-28 2 views
5

Я хочу получить индекс, который ссылается на позиции значений NA в матрице, где индекс является истинным, если заданная ячейка является NA и существует по меньшей мере одно значение не-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. Но это кажется немного грязным, поэтому мне интересно, есть ли более чистое выражение, которое делает это без циклов.

EDIT Для того чтобы иметь значение, значение NA должно иметь значение не-NA до и после него где-то внутри столбца, но не обязательно рядом с ним. Например, если столбец был определен c (NA, 3, NA, NA, NA, 4, NA), то NA, которые я хочу найти, будет в позициях 3, 4 и 5, так как они заключены в не-NA.

+0

[2,3] также не может быть возвращен? – daroczig

+0

daroczig - нет, потому что нет значения не-NA до и после него в столбце. – Abiel

+0

спасибо, я должен был более внимательно прочитать ваш вопрос. Я попытался составить векторный ответ на основе ваших данных, я надеюсь, что он может работать на вас. – daroczig

ответ

4

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

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 - Я думаю, что это очень мило, но я предвзято)

+0

Спасибо, Бен, мои первоначальные тесты, показывающие эту работу. – Abiel

+0

Вам нужно объяснить ум. x1 - это последовательность индексирования, которая увеличивается при не-NA-записи, считая сверху вниз. x2 - то же самое, считая назад (снизу вверх). Они только оба отличны от нуля во внутренних записях, заключенных не-NA, как сверху, так и снизу, поэтому их индексы не-NA, подсчитываемые в обоих направлениях, равны> 0. Наконец, ворота, которые с помощью & фильтруют только внутренние НС. Можете ли вы переименовать x1, x2, чтобы быть более интуитивным? nonNA_idx.tb, nonNA_idx.bt, возможно? – smci

+0

@smci, если у вас есть необходимая репутация (и похоже, что вы делаете - 2K), не стесняйтесь редактировать ... –

1
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

Ваш ответ и мои взаимодополняющие, я думаю (разные интерпретации вопроса) –

+0

На самом деле при более близком чтении я думаю, что у меня все получилось, потому что моя версия возвращает больше чем [2, 2]. Измените '|' в последней строке на '&', и он возвращает только [2, 2], но я думаю, что он ищет суммарное количество NA. Однако полезный вопрос, потому что я никогда раньше не понимал, как обращаться к соседним строкам и столбцам без использования цикла for. –

+0

Извините за замешательство, я имел в виду NA, для которого есть значение, отличное от NA, SOMEWHERE до или после него в столбце, но не обязательно рядом с ним. Например, если у вас есть матрица входных матриц (c (NA, 1, NA, NA, 1, NA, NA, 2, NA, NA, NA, NA, 1,2,3,4), ncol = 4), вы хотели бы вернуть [2,2] и [2,3]. Тем не менее, ваш код, безусловно, предлагает интересный подход к связанной с этим проблеме обращения с NA, для которых должно быть смежное значение, отличное от NA. – Abiel

0

PTS < - образец (с (1: 10, НС), размер = 100, заменить = T)

мат < - матрица (PTS, Ncol = 10)

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

Смежные вопросы