В столбце (и строке) указатели элементов, не относящихся к 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
)