这是我的名为“stock”的数据表:
TickerID Date Open Close
A 1/1/2013 42.1 43.4
A 1/2/2013 43.4 42.3
A 1/3/2013 42.3 44.1
AA 1/1/2013 28.7 28.9
AA 1/2/2013 28.9 28.4
AA 1/3/2013 28.4 29.1
AAA 1/1/2013 61.1 62.1
AAA 1/2/2013 62.1 63.5
AAA 1/3/2013 63.5 64.4
如何添加允许每个TickerID显示明天打开的列?贴近值?当TickerID没有“下一个日期”时,我还需要一个NA 我希望它看起来像这样:
TickerID Date Open Close OpenTom CloseTom
A 1/1/2013 42.1 43.4 43.4 42.3
A 1/2/2013 43.4 42.3 42.3 44.1
A 1/3/2013 42.3 44.1 NA NA
AA 1/1/2013 28.7 28.9 28.9 28.9
AA 1/2/2013 28.9 28.4 28.4 29.1
AA 1/3/2013 28.4 29.1 NA NA
AAA 1/1/2013 61.1 62.1 62.1 63.5
AAA 1/2/2013 62.1 63.5 63.5 64.4
AAA 1/3/2013 63.5 64.4 NA NA
以下是我正在尝试的代码:
for (i in 2:nrow(stock)){
if(stock[i,"TickerID"]==NYSE[i-1,"TickerID"]){
stock[i,"CloseTom"] <- stock[i+1,"Close"]
stock[i,"OpenTom"] <- stock[i+1,"Open"]
}
}
如何加快此代码的速度,以便在300,000多行上使用它?
注意:我不需要检查下一行是否有下一个日期,我知道这是真的
答案 0 :(得分:0)
尝试以下方法。 OpenTom和CloseTom基本上与Open和Close相同。关闭只是滞后1,它们有一些缺失值,所以:
Stock$OpenTom <- Stock$Close
Stock$CloseTom <- c(Stock$Close[2:length(Stock$Close)],NA)
然后找到TickerID的最后一个出现值。 !duplicatelicated()找到第一个唯一元素,因此您可以将其应用于列的反向并再次将其反转。
lastday <- rev(!duplicated(rev(Stock$TickerID)))
然后只需用NA
替换这些IDStock$OpenTom[which(lastday)] <- NA
Stock$CloseTom[which(lastday)] <- NA
Stock
# TickerID Date Open Close OpenTom CloseTom
#1 A 0.0004967710 42.1 43.4 43.4 42.3
#2 A 0.0002483855 43.4 42.3 42.3 44.1
#3 A 0.0001655903 42.3 44.1 NA NA
#4 AA 0.0004967710 28.7 28.9 28.9 28.4
#5 AA 0.0002483855 28.9 28.4 28.4 29.1
#6 AA 0.0001655903 28.4 29.1 NA NA
#7 AAA 0.0004967710 61.1 62.1 62.1 63.5
#8 AAA 0.0002483855 62.1 63.5 63.5 64.4
#9 AAA 0.0001655903 63.5 64.4 NA NA
答案 1 :(得分:0)
您可以使用dplyr
:
dat %>% group_by(TickerID) %>% mutate(OpenTom = ifelse(Date != max(Date),Close,NA),
CloseTom = ifelse(Date != max(Date),Close[2:3],NA))