Использование purrr для применения кумулятивной функции

Для каждой позиции x я хочу подсчитать, сколько чисел было> 5. Вот мой код, использующий цикл for:

x<-c(2,8,4,9,10,6,7,3,1,5)

y <- vector()
for (i in seq_along(x)) {
  x1 <- x[1:i]
  y <- c(y, length(x1[x1>5]))
}
> y
 [1] 0 1 1 2 3 4 5 5 5 5

Можете ли вы помочь мне сделать это с помощью мурлыканья. Можно ли здесь использовать purrr :: reduce?


person Brani    schedule 22.10.2016    source источник


Ответы (2)


Вы можете использовать accumulate() из purrr:

accumulate(x > 5, `+`)
#[1] 0 1 1 2 3 4 5 5 5 5

По сути, это оболочка для Reduce() с accumulate = TRUE

accumulate <- function(.x, .f, ..., .init) {
  .f <- as_function(.f, ...)

  f <- function(x, y) {
    .f(x, y, ...)
  }

  Reduce(f, .x, init = .init, accumulate = TRUE)
}
person Steven Beaupré    schedule 22.10.2016

cumsum функция может это сделать

cumsum(x>5)
#[1] 0 1 1 2 3 4 5 5 5 5
person user2100721    schedule 22.10.2016
comment
@Brani попросил решение, которое использует функции purrr. - person amarchin; 26.06.2017
comment
@amarchin Я добавил подход с использованием base R, потому что считаю, что никто не добавляет пакет, когда это можно сделать с помощью базовой функции, если это не дает огромной выгоды. - person user2100721; 27.06.2017