【问题标题】:R Create new column and shift values 1 rowR创建新列并将值移动1行
【发布时间】:2019-02-04 16:14:54
【问题描述】:

我想创建一个新列,然后我想在下一行中包含第二天的值。在我的示例数据框中,我有 3 列:日期、价格和回报。现在我想检测过​​度反应。如果回报高于平均值 + 1 个标准差,则回报是过度反应。如果不是,则值为“NA”。

library(tidyverse)
library(quantmod)

df <- tibble( 
date = lubridate::today() +0:9,
price = c(1,2.5,2,3,5,6.5,4,9,3,4))

df <- mutate(df, return = Delt(price))

df <- df %>% mutate(overreaction= 
                  ifelse(return >  mean(df$return, na.rm = TRUE) +  sd(df$return, na.rm = TRUE),
                   yes = return, no = NA
          )
)

现在我正在创建一个新列,如果前一天发生过度反应,它会返回第二天的数据。

df <- df %>% mutate(following_day = 
                  ifelse(overreaction != "NA",
                         yes= return%>% data.table::shift(n=1L, fill=NA, type=c("lead")),
                         no=NA)
                )

print(df)
# A tibble: 10 x 5
   date       price                  return                     overreaction               following_day
   <date>     <dbl>                    <dbl>                      <dbl>                       <dbl>
 1 2019-02-04   1                     NA                          NA                         NA    
 2 2019-02-05   2.5                    1.5                         1.5                       -0.200
 3 2019-02-06   2                     -0.200                      NA                         NA    
 4 2019-02-07   3                      0.5                        NA                         NA    
 5 2019-02-08   5                      0.667                      NA                         NA    
 6 2019-02-09   6.5                    0.3                        NA                         NA    
 7 2019-02-10   4                     -0.385                      NA                         NA    
 8 2019-02-11   9                      1.25                        1.25                      -0.667
 9 2019-02-12   3                     -0.667                      NA                         NA    
10 2019-02-13   4                      0.333                      NA                         NA    

除了一个问题外,它还有效: 我希望 following_day-column 中的值移动 1 行,以便它们处于原始位置。 数据框应该是这样的:

# A tibble: 10 x 5
   date       price                  return                     overreaction               following_day
   <date>     <dbl>                    <dbl>                      <dbl>                       <dbl>
 1 2019-02-04   1                     NA                          NA                         NA    
 2 2019-02-05   2.5                    1.5                         1.5                       NA
 3 2019-02-06   2                     -0.200                      NA                         -0.200    
 4 2019-02-07   3                      0.5                        NA                         NA    
 5 2019-02-08   5                      0.667                      NA                         NA    
 6 2019-02-09   6.5                    0.3                        NA                         NA    
 7 2019-02-10   4                     -0.385                      NA                         NA    
 8 2019-02-11   9                      1.25                        1.25                      NA
 9 2019-02-12   3                     -0.667                      NA                         -0.667    
10 2019-02-13   4                      0.333                      NA                         NA  

有人可以帮我吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    df$following_day 括在dplyr::lag 中:

    library(tidyverse)
    library(quantmod)
    
    df <- tibble( 
      date = lubridate::today() +0:9,
      price = c(1,2.5,2,3,5,6.5,4,9,3,4)) %>% 
      mutate(return= Delt(price))
    
    df <- mutate(df, overreaction = 
                          ifelse( return > mean(df$return, na.rm = TRUE) +  sd(df$return, na.rm = TRUE),
                                              return, NA))
    
    df <- mutate(df, following_day = ifelse(!is.na(overreaction),
                                               data.table::shift(df$return, type = "lead"),
                                               NA))
    
    df$following_day <- dplyr::lag(df$following_day) # or data.table::shift
    

    输出:

    > df
    # A tibble: 10 x 5
       date       price  return overreaction following_day
       <date>     <dbl>   <dbl>        <dbl>         <dbl>
     1 2019-02-04   1    NA            NA           NA    
     2 2019-02-05   2.5   1.5           1.5         NA    
     3 2019-02-06   2    -0.200        NA           -0.200
     4 2019-02-07   3     0.5          NA           NA    
     5 2019-02-08   5     0.667        NA           NA    
     6 2019-02-09   6.5   0.3          NA           NA    
     7 2019-02-10   4    -0.385        NA           NA    
     8 2019-02-11   9     1.25          1.25        NA    
     9 2019-02-12   3    -0.667        NA           -0.667
    10 2019-02-13   4     0.333        NA           NA  
    

    同样可以通过将dplyr::lag 替换为data.table::shift(df$following_day, type = "lag") 来实现

    【讨论】:

    • 这是输出,但我想要将 following_day-column 中的值移动 1 行
    • 我的输出与你的不同。 following_day 移动了 1 行(例如,值 -0.200 现在位于第 2 行)。这不是你想要的吗?
    • 没有。在我的输出中,值 -0.200 也在第 2 行。但我希望值 -0.200 在第 3 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多