Роллинг применяется к подмножеству вектора - PullRequest
3 голосов
/ 02 октября 2011

Я хочу применить функцию к прогрессивным подмножествам вектора в R. Я посмотрел на то, что я мог найти, и приложение apply и друзья не совсем там, и rollapply не работает на прямых векторах, только zoo /тс объекты.

vapply <- function(x, n, FUN=sd) {
    v <- c(rep(NA, length(x)))
    for (i in n:length(x) ) {  
        v[i] <- FUN(x[(i-n+1):i])
    }
    return(v)
}

Есть ли что-то встроенное, что эквивалентно?Есть ли лучший способ сделать это?Я пытаюсь избежать зависимости от сторонних библиотек, так как код должен быть автономным для распространения.

1 Ответ

3 голосов
/ 03 октября 2011

С вашим выбором имени функции, я просто должен был сделать версию, которая на самом деле использует vapply для внутреннего использования :) ... оказывается, примерно на 50% быстрее в примере ниже. Но это, конечно, во многом зависит от того, сколько работы сделано в FUN ...

# Your original version - renamed...
slideapply.org <- function(x, n, FUN=sd) {
    v <- c(rep(NA, length(x)))
    for (i in n:length(x) ) {  
        v[i] <- FUN(x[(i-n+1):i])
    }
    return(v)
}

slideapply <- function(x, n, FUN=sd, result=numeric(1)) {
    stopifnot(length(x) >= n) 
    FUN <- match.fun(FUN)
    nm1 <- n-1L
    y <- vapply(n:length(x), function(i) FUN(x[(i-nm1):i]), result)

    c(rep(NA, nm1), y) # Why do you want NA in the first entries?
}

x <- 1:2e5+0 # A double vector...
system.time( a <- slideapply.org(x, 50, sum) )  # 1.25 seconds
system.time( b <- slideapply(x, 50, sum) )      # 0.80 seconds
identical(a, b) # TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...