Функция ifelse () - обратитесь к следующему дню - PullRequest
6 голосов
/ 14 марта 2019

У меня есть датафрейм с 2 столбцами: дата и возврат.

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

А теперь я хочу добавить третий столбец с условием ifelse. Если возврат в день t выше 3,5, то повторный запуск в последующий день t + 1 равен NA (иначе = возврат в день t).

Вот мой желаемый вывод:

date         return      retrun_subsequent_day
<date>       <dbl>       <dbl>
1 2019-03-14    1        1
2 2019-03-15    2.5      2.5
3 2019-03-16    2        2
4 2019-03-17    3        3
5 2019-03-18    5        5
6 2019-03-19    6.5      NA
7 2019-03-20    1        NA
8 2019-03-21    9        9
9 2019-03-22    3        NA
10 2019-03-23   2        2

Может кто-нибудь описать мне, как я могу сформулировать это условие?

Ответы [ 5 ]

6 голосов
/ 14 марта 2019

с использованием lag и mutate из dplyr. С лагом мы сравниваем return -значение предыдущей строки с 3.5: если оно больше или равно, мы берем NA, а если оно меньше, мы берем возвращаемое значение текущей строки

library(dplyr)

df <- df %>% mutate(return_subsequent_day = ifelse(lag(return, default = 0) >= 3.5, NA, return))

выход: * +1010 *

# A tibble: 10 x 3
   date       return return_subsequent_day
   <date>      <dbl>                 <dbl>
 1 2019-03-14    1                     1  
 2 2019-03-15    2.5                   2.5
 3 2019-03-16    2                     2  
 4 2019-03-17    3                     3  
 5 2019-03-18    5                     5  
 6 2019-03-19    6.5                  NA  
 7 2019-03-20    1                    NA  
 8 2019-03-21    9                     9  
 9 2019-03-22    3                    NA  
10 2019-03-23    2                     2  
6 голосов
/ 14 марта 2019

Подход base R будет состоять в том, чтобы создать копию 'return' в качестве нового столбца 'return_sub', затем, используя числовой индекс ('i1'), присвоить значение NA

i1 <- which(df$return > 3.5)
df$return_subsequent_day <- df$return
df$return_subsequent_day[pmin(i1 +1, nrow(df))] <- NA
df$return_subsequent_day
#[1] 1.0 2.5 2.0 3.0 5.0  NA  NA 9.0  NA 2.0
2 голосов
/ 14 марта 2019

Простое решение с использованием ifelse

df$return_sub_day <- ifelse(dplyr::lag(df$return) > 3.5, NA ,df$return)
df$return_sub_day[1] <- df$return[1]
1 голос
/ 14 марта 2019

запутано, но коротко и весело:

df$return_subsequent_day <- df$return * lag(df$return < 3.5, 1, 1)^NA
0 голосов
/ 14 марта 2019

способ таблицы данных, эффективный для большего набора данных-

  data.table::setDT(df)[,return_sbq:=ifelse(shift(return,fill=0) >= 3.5, NA, return)]

> df
          date return return_sbq
 1: 2019-03-14    1.0        1.0
 2: 2019-03-15    2.5        2.5
 3: 2019-03-16    2.0        2.0
 4: 2019-03-17    3.0        3.0
 5: 2019-03-18    5.0        5.0
 6: 2019-03-19    6.5         NA
 7: 2019-03-20    1.0         NA
 8: 2019-03-21    9.0        9.0
 9: 2019-03-22    3.0         NA
10: 2019-03-23    2.0        2.0
...