【问题标题】:How to shift a column by one row for each new ID in R如何为R中的每个新ID将一列移动一行
【发布时间】:2016-06-15 21:04:45
【问题描述】:

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

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

【问题讨论】:

    标签: r reverse lag


    【解决方案1】:

    试试下面的。 OpenTom 和 CloseTom 与 Open 和 Close 基本上是相同的列。 Close 只是滞后 1 并且它们有一些缺失值,所以:

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

    然后找到 TickerID 最后出现的值。 !duplicated() 找到第一个唯一元素,因此您可以将其应用于列的反向并再次将其反向。

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

    然后简单地将这些 ID 替换为 NA

    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
    

    【讨论】:

      【解决方案2】:

      你可以使用dplyr:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        相关资源
        最近更新 更多