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))
我有几年的每日库存 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))