代码之家  ›  专栏  ›  技术社区  ›  89_Simple

R中的滚动和

  •  0
  • 89_Simple  · 技术社区  · 6 年前
    df <- data.frame(x = seq(1:10))
    

    df$y <- c(1, 2, 3, 4, 5, 15, 20 , 25, 30, 35)
    

    i、 e.每个 y x 价值观。这意味着第一个 是的 将与

    我得到的是:

    df$y1 <- c(df$x[1:4], RcppRoll::roll_sum(df$x, 5)) 
    
      x  y y1
      1  1  1
      2  2  2
      3  3  3
      4  4  4
      5  5 15
      6 15 20
      7 20 25
      8 25 30
      9 30 35
      10 35 40
    

    总之,我需要 但我只能做到 y1

    3 回复  |  直到 6 年前
        1
  •  4
  •   G. Grothendieck    6 年前

    1) 增强和函数 定义函数 Sum partial=TRUE 在里面 rollapplyr

    Sum <- function(x) if (length(x) < 6) tail(x, 1) else sum(head(x, -1))
    rollapplyr(x, 6, Sum, partial = TRUE)
    ##  [1]  1  2  3  4  5 15 20 25 30 35
    

    2) 和6减去原来的 另一种可能是取6个元素的运行和,用NA填充前5个元素,然后减去原始向量。最后填写前5题。

    replace(rollsumr(x, 6, fill = NA) - x, 1:5, head(x, 5))
    ##  [1]  1  2  3  4  5 15 20 25 30 35
    

    第三种可能是使用宽度的偏移形式来指定前面的5个元素:

    c(head(x, 5), rollapplyr(x, list(-(1:5)), sum))
    ## [1]  1  2  3  4  5 15 20 25 30 35
    

    4) 偏移量的替代规范 在这个备选方案中,我们为前5个元素中的每一个指定0的偏移量,为其余元素指定-(1:5)的偏移量。

    width <- replace(rep(list(-(1:5)), length(x)), 1:5, list(0))
    rollapply(x, width, sum)
    ## [1]  1  2  3  4  5 15 20 25 30 35
    

    注意

    填充前5个元素的方案似乎很不寻常,您可以考虑对前5个元素使用部分和,对第一个元素使用NA或0,因为在该元素中没有前5个元素:

    rollapplyr(x, list(-(1:5)), sum, partial = TRUE, fill = NA)
    ## [1] NA  1  3  6 10 15 20 25 30 35
    
    rollapplyr(x, list(-(1:5)), sum, partial = TRUE, fill = 0)
    ## [1]  0  1  3  6 10 15 20 25 30 35
    
    rollapplyr(x, 6, sum, partial = TRUE) - x
    ## [1]  0  1  3  6 10 15 20 25 30 35
    
        2
  •  0
  •   r.user.05apr    6 年前

    一个简单的方法是:

    df <- data.frame(x = seq(1:10))
    mysum <- function(x, k = 5) {
      res <- rep(NA, length(x))
      for (i in seq_along(x)) {
        if (i <= k) { # edited ;-)
          res[i] <- x[i]
        } else {
          res[i] <- sum(x[(i-k):(i-1)])
        }
      }
      res
    }
    mysum(df$x)
    # [1]  1  2  3  4  5 15 20 25 30 35
    
        3
  •  0
  •   Jim Chen    6 年前
    mysum <- function(x, k = 5) {
      res <- x[1:k]
      append<-sapply(2:(len(x)+1-k),function(i) sum(x[i:(i+k-1)]))
      return(c(res,append))
    }
    mysum(df$x)