Вырезать элементы из начала и конца вектора R - PullRequest
0 голосов
/ 30 декабря 2018

Для анализа временных рядов я работаю с данными, которые часто содержат начальные и конечные нулевые элементы.В этом примере 3 ноля в начале и 2 в конце.Я хочу избавиться от этих элементов и отфильтровать содержимое в середине (которое также может содержать нули)

vec <- c(0, 0, 0, 1, 2, 0, 3, 4, 0, 0)

Я сделал это, зацикливая начало и конец и маскируя ненужные элементы..

mask <- rep(TRUE, length(vec))

# from begin
i <- 1
while(vec[i] == 0 && i <= length(vec)) {
  mask[i] <- FALSE
  i <- i+1
}

# from end
i <- length(vec)
while(i >= 1 && vec[i] == 0) {
  mask[i] <- FALSE
  i <- i-1
}

cleanvec <- vec[mask]
cleanvec
[1] 1 2 0 3 4

Это работает, но мне интересно, есть ли более эффективный способ сделать это, избегая петель.

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Мы могли бы использовать range и Reduce, чтобы получить последовательность

vec[Reduce(`:`, range(which(vec != 0)))]
#[1] 1 2 0 3 4
0 голосов
/ 31 декабря 2018

Возьмите cumsum вперед и назад abs(vec) и оставьте только элементы> 0. Если бы было известно, что все элементы vec неотрицательны, как в вопросе, то мы могли бы опционально опустить abs.

vec[cumsum(abs(vec)) > 0 & rev(cumsum(rev(abs(vec)))) > 0]
## [1] 1 2 0 3 4
0 голосов
/ 30 декабря 2018
vec[ min(which(vec != 0)) : max(which(vec != 0)) ]

В основном, часть which(vec != 0) дает позиции чисел, отличных от 0, и затем вы берете их min и max .

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