положения не-NA клеток в матрице - PullRequest
1 голос
/ 07 марта 2012

Рассмотрим следующую матрицу,

m <- matrix(letters[c(1,2,NA,3,NA,4,5,6,7,8)], 2, byrow=TRUE)
##      [,1] [,2] [,3] [,4] [,5]
## [1,] "a"  "b"  NA   "c"  NA  
## [2,] "d"  "e"  "f"  "g"  "h" 

Я хочу получить индексы столбцов, соответствующие всем элементам, не относящимся к NA, объединенным с элементами NA, сразу следующими:

result <- c(list(1), list(2:3), list(4,5), 
                   list(1), list(2), list(3), list(4), list(5))

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 07 марта 2012

В столбце (и строке) указатели элементов, не относящихся к NA, можно получить с помощью

which(!is.na(m), TRUE)

Полный ответ:

Поскольку вы хотите работать по строкам, а R обрабатывает вектор по столбцам, проще работать с транспонированием m.

t_m <- t(m)
n_cols <- ncol(m)

Мы получаем указатель массива, как указано выше, который дает начальную точку каждого списка.

ind_non_na <- which(!is.na(t_m), TRUE)

Поскольку мы работаем над транспонированием, нам нужны индексы строк, и нам нужно работать с каждым столбцом отдельно.

start_points <- split(ind_non_na[, 1], ind_non_na[, 2])

Длина каждого списка определяется разницей между начальными точками или разницей между последней точкой и концом строки (+1). Тогда мы просто вызываем seq, чтобы получить последовательность.

unlist(
  lapply(
    start_points, 
    function(x)
    {
      len <- c(diff(x), n_cols - x[length(x)] + 1L)
      mapply(seq, x, length.out = len, SIMPLIFY = FALSE)
    }
  ), 
  recursive = FALSE
)
1 голос
/ 07 марта 2012

Это приблизит вас:

    cols <- col(m)
    cbind(cols[which(is.na(m))-1],cols[is.na(m)])
         [,1] [,2]
    [1,]    2    3
    [2,]    4    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...