R Создать новый столбец и сдвинуть значения на 1 строку - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу создать новый столбец, а затем хочу иметь значения следующего дня в следующей строке.В моем примере-dataframe у меня есть 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    

И это работает, за исключением одной проблемы: я хочу, чтобы значения в столбце следующим_днем были смещены на 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  

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 04 февраля 2019

Вложите 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")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...