【问题标题】:Setting Initial Value for Stock and Rolling Multiple with dplyr::mutate使用 dplyr::mutate 设置 Stock 和 Rolling Multiple 的初始值
【发布时间】:2017-06-14 20:50:31
【问题描述】:

从这个数据集开始:

df <- data.frame(
  year = 2007,
  month = c('Jan', 'Feb', 'Mar', 'April'),
  percent_change = c(0.0314, 0.0073, 0.0135, -0.0144),
  to_multiply = c(1.0314, 1.0073, 1.0135, .9856)
)

我想生成以下数据集。

year month percent_change to_multiply dollar_value
2007   Jan         0.0314      1.0314     103.1400
2007   Feb         0.0073      1.0073     103.8929
2007   Mar         0.0135      1.0135     105.2955
2007 April        -0.0144      0.9856     103.7792

我想知道如何以编程方式分配初始值并创建一个新列来显示每个月之后的股票价值。这在电子表格中很容易做到,但我想远离它,这样我就可以使用相同的初始开始值快速绘制不同的开始日期和/或分配。

我尝试过使用延迟包装器进行变异,但我无法让它发挥作用。我查看了 RCCPRoll,但也没能成功。

【问题讨论】:

  • 请附上图片和reproducible example;我们无法帮助您处理您在此处放置的内容。
  • 顺便说一句,您可以将图像直接粘贴到问题中。
  • 我已删除图像文件并用可重现的示例替换它们。我没有包括代码尝试,因为我被困在如何处理这个问题上。对于没有遵循 S/O 问题协议,我深表歉意。
  • 关于如何在电子表格中“链接值”的基本问题; cumsumcumproddiff 可以处理大多数情况,但是当您需要更多情况时,它会变得很棘手。 zoo::rollapply 可能会有所帮助,但通常您需要初始化一列,然后执行循环。

标签: r dplyr


【解决方案1】:

对你有帮助的是cumprod,但我可以建议使用data.table吗?

dt <- data.table(year = 2007,
                 month = c('Jan', 'Feb', 'Mar', 'April'),
                 percent_change = c(0.0314, 0.0073, 0.0135, -0.0144),
                 to_multiply = c(1.0314, 1.0073, 1.0135, .9856))
dt[ , newvalue := cumprod(to_multiply) * 100]
dt
#    year month percent_change to_multiply newvalue
# 1: 2007   Jan         0.0314      1.0314 103.1400
# 2: 2007   Feb         0.0073      1.0073 103.8929
# 3: 2007   Mar         0.0135      1.0135 105.2955
# 4: 2007 April        -0.0144      0.9856 103.7792

其实是一个更短的版本:

dt <- data.table(year = 2007,
                 month = c('Jan', 'Feb', 'Mar', 'April'),
                 percent_change = c(0.0314, 0.0073, 0.0135, -0.0144))
dt[ , newvalue := 100 * cumprod(1 + percent_change)]
dt
#    year month percent_change newvalue
# 1: 2007   Jan         0.0314 103.1400
# 2: 2007   Feb         0.0073 103.8929
# 3: 2007   Mar         0.0135 105.2955
# 4: 2007 April        -0.0144 103.7792

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多