如何为R中的每个新ID将列换一行

时间:2016-03-02 19:58:45

标签: r reverse lag

  

这是我的名为“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多行上使用它?

     

注意:我不需要检查下一行是否有下一个日期,我知道这是真的

2 个答案:

答案 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

替换这些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

答案 1 :(得分:0)

您可以使用dplyr

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