applying rolling mean by group in R

后端 未结 2 525
猫巷女王i
猫巷女王i 2020-12-10 05:20

I\'m an R newbie and I\'m having a lot of trouble doing something that is probably very simple. I have a big dataset split up into groups by country code, and I want to take

相关标签:
2条回答
  • 2020-12-10 05:42

    In your first attempt, your function does not use its x argument, and always returns the same thing (a vector with the wrong size). In addition, the first argument, should be a vector. Lastly, tapply returns a list of vectors: you cannot put the result directly into a data.frame.

    library(zoo)
    n <- 10
    leader <- data.frame(
      ccode = rep(LETTERS[1:3],each=n),
      GI_delta = rnorm(3*n)
    )
    tapply(
      leader$GI_delta, 
      leader$ccode, 
      function(x) rollmean(x, 3, na.pad=TRUE)
    )
    

    In your second example, the third argument of plyr should be a function, not an expression. If you want to use an expression, you can use summarize or transform as a function (summarize returns a 1-row data.frame for each value of ccode, while transform keeps the number of rows unchanged), and put the expressions as further arguments.

    library(plyr)
    ddply(
      leader, "ccode",
      transform,
      last3 = rollmean( GI_delta, 3, align="right", na.pad=TRUE )
    )
    
    0 讨论(0)
  • 2020-12-10 05:52

    If you want to make a new column, then try using ave. It resembles tapply but returns a vector of the same length as its first argument. My experience is that it is a lot faster than ddply:

    require(zoo)
    leader$last3<-ave(leader$GI_delta, leader$ccode, 
                             FUN= function(x) rollmean(x, k=3, na.pad=T) )
    
    0 讨论(0)
提交回复
热议问题