【问题标题】:Summarize dataframe with a constraint using Dplyr使用 Dplyr 总结带有约束的数据框
【发布时间】:2018-09-20 12:44:26
【问题描述】:

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

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 管道中实现这一点的友好方式?有没有人在管道之外有任何建议?提前感谢您的任何指导。

【问题讨论】:

  • 整理您的数据。融合您的数据,这样您就有一个 ID 列、一个变量列(x 或 y)、一个值列(带有价格)和一个操作列(卖空或买入)。然后你编写一个函数来计算你的利润,并在group_by(variable) 之后使用它来分别对 x 和 y 进行计算。
  • 可以有连续的Buy/Short吗?
  • 没有连续的Buy/Short。 @MKR

标签: r if-statement dplyr summarize


【解决方案1】:

使用lagmutate 的基于dplyr 的解决方案可以实现为:

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)

【讨论】:

  • 非常感谢!这如何自动将NA 放在第一行?这就是让我感到困惑的地方。我试图使用row_number() 来实现这一点。
  • @ConnorGibbs lag 为您提供没有前一行的默认值选项。默认情况下,该值为NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多