【发布时间】:2018-07-10 17:38:06
【问题描述】:
这里有一些示例代码:
library(quantmod)
library(dplyr)
stock.prices <- getSymbols(Symbols = 'AAPL', from = '2017-08-08', to = '2017-08-17', env = NULL)[,c(2,4)]
stock.dividends <- getDividends(Symbol = 'AAPL', from = '2017-08-08', to = '2017-08-17')
summary <- merge(stock.prices, stock.dividends)
summary <- data.frame(date=index(summary), coredata(summary))
summary <- mutate(summary, buy.price = ifelse(is.na(AAPL.div), NA, lag(AAPL.Close, 1)))
summary
它产生以下数据:
date AAPL.High AAPL.Close AAPL.div lag.buy.price
1 2017-08-08 161.83 160.08 NA NA
2 2017-08-09 161.27 161.06 NA NA
3 2017-08-10 160.00 155.32 0.63 161.06
4 2017-08-11 158.57 157.48 NA NA
5 2017-08-14 160.21 159.85 NA NA
6 2017-08-15 162.20 161.60 NA NA
7 2017-08-16 162.51 160.95 NA NA
我想像这样附加一列:
date AAPL.High AAPL.Close AAPL.div lag.buy.price sell.date
1 2017-08-08 161.83 160.08 NA NA NA
2 2017-08-09 161.27 161.06 NA NA NA
3 2017-08-10 160.00 155.32 0.63 161.06 2017-08-15
4 2017-08-11 158.57 157.48 NA NA NA
5 2017-08-14 160.21 159.85 NA NA NA
6 2017-08-15 162.20 161.60 NA NA NA
7 2017-08-16 162.51 160.95 NA NA NA
这找到了我可以卖出以实现收支平衡的第一个日期...我在 2017 年 8 月 9 日买入股票,以便在第二天有资格获得股息。我支付每股161.06。收到股息后,我现在想以 >= 161.06 的价格出售。 2017-08-15 是我能做到这一点的第一天。
我可以运行一个 for 循环来实现这一点,但它看起来相当粗糙和低效。
有没有办法使用 dplyr 生成“sell.date”列?
【问题讨论】:
-
我认为因为每个非
NA值都将与不同列中的所有后续值进行比较,所以在没有for循环的情况下让它工作需要一些重要而脆弱的技巧。我怀疑for循环将更加声明性和清晰性,从而使您(将来)或其他任何人(现在和永远)的可维护性变得更加简单。除非您发现代码性能是个问题,否则我建议您使用for循环。 -
我认为单独使用
dplyr管道是不可能的。您需要的是一些类似于 SQL 中的窗口和框架功能的概念。dplyr不支持这些。我同意for循环是要走的路。