【发布时间】:2021-04-26 22:48:24
【问题描述】:
问题如下:我有一个数据框,我们称之为DF,它看起来像这样:
|Symbol | Date | volume |price |
|------------------------------------
|A |2014-01-01 | 0 | 5 |
|A |2014-01-02 | 3 | 8 |
|A |2014-01-03 | 0 | 4 |
|A |2014-01-04 | 1 | 12 |
|B |2014-01-01 |45 | 9 |
|B |2014-01-02 |3 | 6 |
|B |2014-01-03 |34 | 7 |
|B |2014-01-04 |45 | 34 |
|C |2014-01-01 |4 | 5 |
|C |2014-01-02 |9 | 7 |
|C |2014-01-03 |3 | 8 |
|C |2014-01-04 |0 | 3 |
我需要为数据框中的每个日期计算价值加权投资组合回报,形成每日一系列回报。
通过以下代码行,我从数据框中提取了与单个日期对应的数据:
DF_1 <- DF[date=="2014-01-01"]
获取下一个数据帧:
|Symbol | Date | volume |price |
|------------------------------------
|A |2014-01-01 | 0 | 5 |
|B |2014-01-01 | 45 | 9 |
|C |2014-01-01 | 4 | 5 |
然后,我将volume 列的所有值相加:
(TOT_vol <- colSums(DF_1[ , 3, drop = FALSE]))
我创建了两个额外的列:weight 和 R_i:
DF_1$weight <- as.numeric(DF_1$volume)/TOT_vol
DF_1$R_i <- apply(DF_1[,c(4,5),drop=FALSE],1,prod)
获取下一个数据框:
|Symbol | Date | volume |price | weight | R_i |
|----------------------------------------------------
|A |2014-01-01 | 0 | 5 | 0 | 0 |
|B |2014-01-01 | 45 | 9 | 0.91 | 8.19|
|C |2014-01-01 | 4 | 5 | 0.08 | 0.4|
最后我获得了该特定日期的价值加权回报,使R_i 列中的值变得疯狂:
(RM <- colSums(DF_1[,6,drop=FALSE]))
我的问题是我需要为数据框的所有日期找到 RM 并创建一个包含所有这些每日回报的系列;我是 R 的新手,我知道我必须设置一个 for 循环,但老实说,我不知道该怎么做。
此外,我想知道您是否可以找到一种更简单的方法来执行我所做的查找每日回报的操作。也就是说,无需在我的原始数据框中创建两个新列。
我期待任何帮助。非常感谢!
【问题讨论】:
标签: r dataframe for-loop return calculated-columns