【问题标题】:Calculation on one row of a Data Frame with the other row for calculating returns in R计算数据框的一行,另一行计算 R 中的回报
【发布时间】:2018-04-24 13:45:11
【问题描述】:

我有以下一组包含许多行和列的示例数据。我正在尝试计算每月回报。我过去使用 excel 做过,但找不到解决方案。

返回 = (THIS_MONTH_PRICE/PREVIOUS_MONTH_PRICE) - 1

DF1 = Date Price Stock
1 1/31/2011 339.32 AAPL 2 2/28/2011 353.21 AAPL 3 3/31/2011 348.45 AAPL 4 4/29/2011 348.23 AAPL 5 5/31/2011 347.83 AAPL 6 6/30/2011 335.67 AAPL 7 7/29/2011 390.48 AAPL 8 8/31/2011 384.83 AAPL
输出:

DF2= Date Price Stock RETURNS
1 1/31/2011 339.32 AAPL NA 2 2/28/2011 353.21 AAPL 0.040934811 3 3/31/2011 348.45 AAPL 0.040934811 4 4/29/2011 348.23 AAPL 0.040934811 5 5/31/2011 347.83 AAPL 0.040934811 6 6/30/2011 335.67 AAPL 0.040934811 7 7/29/2011 390.48 AAPL 0.16328537 8 8/31/2011 384.83 AAPL -0.014469371

谁能帮我解决这个问题。谢谢。

【问题讨论】:

  • 你的输出对我来说看起来很奇怪。为什么你收到很多0.040934811

标签: r dataframe lapply finance calculation


【解决方案1】:

如果您对仅使用基础 R 的解决方案感兴趣:

> DF1$RETURNS <- (df$Price / c(0, head(df$Price, -1))) - 1
> DF1
       Date  Price Stock       RETURNS
1 1/31/2011 339.32  AAPL           Inf
2 2/28/2011 353.21  AAPL  0.0409348108
3 3/31/2011 348.45  AAPL -0.0134764021
4 4/29/2011 348.23  AAPL -0.0006313675
5 5/31/2011 347.83  AAPL -0.0011486661
6 6/30/2011 335.67  AAPL -0.0349596067
7 7/29/2011 390.48  AAPL  0.1632853696
8 8/31/2011 384.83  AAPL -0.0144693710

【讨论】:

    【解决方案2】:

    我们可以使用 包中的lag 函数。

    library(dplyr)
    
    df2 <- df1 %>% mutate(RETURNS = Price/lag(Price) - 1)
    
    df2
    #        Date  Price Stock       RETURNS
    # 1 1/31/2011 339.32  AAPL            NA
    # 2 2/28/2011 353.21  AAPL  0.0409348108
    # 3 3/31/2011 348.45  AAPL -0.0134764021
    # 4 4/29/2011 348.23  AAPL -0.0006313675
    # 5 5/31/2011 347.83  AAPL -0.0011486661
    # 6 6/30/2011 335.67  AAPL -0.0349596067
    # 7 7/29/2011 390.48  AAPL  0.1632853696
    # 8 8/31/2011 384.83  AAPL -0.0144693710
    

    数据

    df1 <- read.table(text = "           Date Price   Stock
                      1   '1/31/2011'   339.32  AAPL
                      2   '2/28/2011'   353.21  AAPL
                      3   '3/31/2011'   348.45  AAPL
                      4   '4/29/2011'   348.23  AAPL
                      5   '5/31/2011'   347.83  AAPL
                      6   '6/30/2011'   335.67  AAPL
                      7   '7/29/2011'   390.48  AAPL
                      8   '8/31/2011'   384.83  AAPL",
                      header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2022-01-07
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多