簡體   English   中英

使用Dplyr匯總具有約束的數據框

[英]Summarize dataframe with a constraint using Dplyr

我有一個類似於以下數據框:

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。 相應的價格在第一天(第二行)移動並結算。 x的利潤為0-2=-2 (因為我賣空了x),y的利潤為5-11=-6 (因為我買了y)。 等等...

有沒有在Dplyr管道中實現此目標的友好方法? 有人在管道之外有任何建議嗎? 在此先感謝您的指導。

使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM