1

我有一个庞大的数据集,包含 34 年中 500 只股票的每日收益。我首先运行 ddply 来创建年度中位数并返回列:

annual <- ddply(data, c("TICKER", "year"), summarize, 
                median_data = median(RETX),
                return = prod(1 + RET))

目前的数据如下所示:

  TICKER year median_data    return
1      A 2000  -0.0081645 0.6717770 
2      A 2001  -0.0036845 0.5207290 
3      A 2002  -0.0069040 0.6299523
4      A 2003   0.0036585 1.6280659  
5      A 2004   0.0000120 0.8242153  
6      A 2005   0.0004025 1.3813425  

现在我想创建一个新列,其中包含过去两年每个股票代码的平均中位数数据:

  TICKER year median_data    return    avg_median
1      A 2000  -0.0081645 0.6717770           NA
2      A 2001  -0.0036845 0.5207290    -0.0036845
3      A 2002  -0.0069040 0.6299523    -0.0105885
4      A 2003   0.0036585 1.6280659           ...
5      A 2004   0.0000120 0.8242153  
6      A 2005   0.0004025 1.3813425  

对此的任何帮助将不胜感激!

4

2 回答 2

3

dplyr解决方案:

为了完整性+正确性,这是dplyr因为这个问题有一个 dplyr 标签。除非我遗漏了某些东西,否则 dvdkamp 的解决方案只有在您有一只股票时才有效。

数据:500只股票,34年

df <- expand.grid(
    year = 1980:2014,
    TICKER = paste0(expand.grid(letters,letters)[1:500,1],
                   expand.grid(letters,letters)[1:500,2])
            )
df$median_data <- rnorm(1:500)
df <- df[,c(2,1,3)]

看起来像这样:

  TICKER year median_data
1     aa 1980   0.5734215
2     aa 1981   1.2102109
3     aa 1982   0.8643419
4     aa 1983   0.7645975
5     aa 1984   0.4004396
6     aa 1985  -1.0195817

第一组入股

by_ticker <- df %>% group_by(TICKER)

用于lag()生成意味着:

今年和去年的平均值。注意默认值lag(,n=1) (包括最近 2 年)

by_ticker %>% 
         mutate(mean_last2y_incl = ( median_data + lag(median_data) ) / 2 )

去年和前一年的平均值。 (过去 2 年独家)

by_ticker %>% 
         mutate(mean_last2y_excl = ( median_data + lag(median_data, n=2) ) / 2 )

有关更多信息,请参见:http ://cran.rstudio.com/web/packages/dplyr/vignettes/window-functions.html 。

于 2014-05-24T05:51:25.833 回答
1

尝试

window_size <- 2 # number of years to average over

data$avg_median <- filter(data$median_data, 
rep(1,window_size)/window_size,  ## filter coefficients (1/2, 1/2)
sides = 1) ## do the average for years before and including this year
于 2014-04-07T18:36:52.220 回答