2016-03-02 37 views
1

這裏轉移被稱爲我的數據表「股票」:如何一列由每一行對應一個新的ID R中

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到列目前明天開放&關閉值?我還需要有一個NA當TickerID沒有「下一個日期」 我想它看起來像這樣:

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

嘗試以下。 OpenTom和CloseTom與Open和Close基本相同。關閉只需擁有1滯後和他們有一些缺失值,以便:

Stock$OpenTom <- Stock$Close 
Stock$CloseTom <- c(Stock$Close[2:length(Stock$Close)],NA) 

然後找到TickerID最後發生的歷史價值。 !duplicated()找到第一個唯一元素,所以你可以將它應用到該列的反面並將其反轉回去。

lastday <- rev(!duplicated(rev(Stock$TickerID))) 

然後只需用NA

替代這些ID
Stock$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 
0

你可以使用dplyr

dat %>% group_by(TickerID) %>% mutate(OpenTom = ifelse(Date != max(Date),Close,NA), 
    CloseTom = ifelse(Date != max(Date),Close[2:3],NA)) 
相關問題