代码之家  ›  专栏  ›  技术社区  ›  cgibbs_10

使用Dplyr汇总具有约束的数据帧

  •  1
  • cgibbs_10  · 技术社区  · 8 年前

    我有一个类似于下面的数据帧:

    data <- data.frame(x = c("0", "2", "8", "1", "7", "10", "15", "14", "13", "11"),
                       y = c("11", "5", "14", "9", "13", "7", "4", "0", "12", "8"),
                       act_x = c("Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy"),
                       act_y = c("Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short"))
    

    我希望根据对x和y采取的操作,为x和y创建一个利润列和一个利润列。结果应该如下所示:

    res <- data.frame(data,
                      prof_x = c(NA, -2, 6, 7, 6, -3, 5, 1, -1, 2),
                      prof_y = c(NA, -6, -9, -5, -4, -6, 3, -4, -12, -4))
    

    例如,从第0天(第一行)开始,我做空x并买入y。相应的价格在第1天(第二行)移动并结算。x的利润为 0-2=-2 (因为我做空了x)而y的利润是 5-11=-6 (自从我买了y之后)。等等

    有没有一种友好的方法可以在Dplyr管道中实现这一点?除了管道之外,有人有什么建议吗?提前感谢您的指导。

    1 回复  |  直到 8 年前
        1
  •  2
  •   MKR    8 年前

    A. dplyr 基于解决方案使用 lag mutate 可通过以下方式实现:

    library(dplyr)
    data %>% mutate(x = as.numeric(x), y = as.numeric(y)) %>%
      mutate(prof_x = ifelse(act_x == "Buy", lag(x)-x, x-lag(x))) %>%
      mutate(prof_y = ifelse(act_y == "Buy", lag(y)-y, y-lag(y)))
    # 
    # x  y act_x act_y prof_x prof_y
    # 1   0 11 Short   Buy     NA     NA
    # 2   2  5   Buy Short     -2     -6
    # 3   8 14 Short   Buy      6     -9
    # 4   1  9   Buy Short      7     -5
    # 5   7 13 Short   Buy      6     -4
    # 6  10  7   Buy Short     -3     -6
    # 7  15  4 Short   Buy      5      3
    # 8  14  0   Buy Short      1     -4
    # 9  13 12 Short   Buy     -1    -12
    # 10 11  8   Buy Short      2     -4
    

    数据:

    data <- data.frame(x = c("0", "2", "8", "1", "7", "10", "15", "14", "13", "11"),
            y = c("11", "5", "14", "9", "13", "7", "4", "0", "12", "8"),
            act_x = c("Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy"),
            act_y = c("Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short", "Buy", "Short"),
            stringsAsFactors = FALSE)
    
    推荐文章