R 中的 For 循环 - 更改每月 returns 的序列

For-Loops in R - Changing the sequences for monthly returns

我有几年的每日库存 returns,我想复合每月库存 returns。我的数据如下所示:

R2[1:5, 1:5]
                       1996-01-01 1996-01-02 1996-01-03 1996-01-04 1996-01-05
BERKSHIRE HATHAWAY 'A'          1  0.9813084   0.981746  0.9862571  0.9836066
MORGAN STANLEY                  1  1.0053210   1.007944  0.9894978  0.9867380
GOLDMAN SACHS GP.              NA         NA         NA         NA         NA
CHARLES SCHWAB                  1  1.0248524   1.018196  0.9642593  1.0061998
BLACKROCK                      NA         NA         NA         NA         NA  

日期按列排列,公司名称按行排列。每日 return 是数字。 因此,对于给定的一个月,我应用以下内容:

R4 <- R4 %>% 
      mutate("1996-02" = apply(select(R2, matches("1996-02")), 1, prod))

R4[1:5, 1:2]
                         1996-01   1996-02
BERKSHIRE HATHAWAY 'A' 0.9937695 1.1128527
MORGAN STANLEY         1.1516025 0.9930737
GOLDMAN SACHS GP.             NA        NA
CHARLES SCHWAB         1.2484572 1.0149366
BLACKROCK                     NA        NA

我想要一个自动计算从 1996 年到 2020 年每月 returns 的循环并尝试了这个:

R3 <- for(i in 1996:2020) {
  for(j in 1:12) {
    mutate("i-j" = apply(select(R2, matches ("i-j")), 1, prod)) 
    }
  }

我将如何正确定义 i 和 j 以便循环在整个期间内每个月改变变量并调整每日库存 returns 必须用于计算每月 return?目前我只是把它们作为占位符。

或者有更好更简单的方法吗?

编辑 - 重现我的数据:

df <- data.frame(c(1, 1, NA, 1, NA), 
                 c(0.981308411214953, 1.00532100309623, NA, 1.02485242822646, NA), 
                 c(0.981746031746032, 1.0079443588933, NA, 1.01819550348529, NA), 
                 c(0.986257073565077, 0.989497753854871, NA, 0.964259312827436, NA), 
                 c(0.983606557377049, 0.986737970101638, NA, 1.00619979334022, NA))

colnames(df) <- as.Date(c("1996-01-01", "1996-01-02", "1996-01-03", "1996-01-04", "1996-01-05")) 
rownames(df) <- c("BERKSHIRE HATHAWAY 'A'", "MORGAN STANLEY", "GOLDMAN SACHS GP.", "CHARLES SCHWAB", "BLACKROCK")

解法:

R3 <- R2 %>%
  rownames_to_column("company") %>%
  pivot_longer(cols = -company) %>%
  mutate(name = as.Date(name), 
         year = year(name),
         month = month(name),
         day = day(name)) %>%
  group_by(company, year, month) %>%
  summarise(value = prod(value, na.rm = FALSE))

或许,你可以得到长格式的数据,计算出每一年、每一家公司的产品。

library(tidyverse)
library(lubridate)

df %>%
  rownames_to_column('company') %>%
  pivot_longer(cols = -company) %>%
  mutate(name = as.Date(name), 
         year = year(name)) %>%
  group_by(company, year) %>%
  summarise(value = prod(value, na.rm = TRUE))