【问题标题】:ifelse() function - refer to the following dayifelse() 函数 - 指次日
【发布时间】:2019-08-05 12:46:42
【问题描述】:

我有一个包含 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

谁能描述我如何制定这个条件?

【问题讨论】:

    标签: r lubridate tibble


    【解决方案1】:

    数据表方式,对大数据集高效-

      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
    

    【讨论】:

      【解决方案2】:

      含糊不清,但简短有趣:

      df$return_subsequent_day <- df$return * lag(df$return < 3.5, 1, 1)^NA
      

      【讨论】:

        【解决方案3】:

        使用 ifelse 的简单解决方案

        df$return_sub_day <- ifelse(dplyr::lag(df$return) > 3.5, NA ,df$return)
        df$return_sub_day[1] <- df$return[1]
        

        【讨论】:

          【解决方案4】:

          使用来自dplyrlagmutate。使用延迟,我们将前一行的return-value 与3.5 进行比较:如果大于或相等,我们取NA,如果它更小,我们取当前行的返回值

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

          输出:

          # 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  
          

          【讨论】:

            【解决方案5】:

            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
            

            【讨论】:

              猜你喜欢
              • 2021-10-11
              • 2015-07-11
              • 1970-01-01
              • 2015-10-16
              • 1970-01-01
              • 1970-01-01
              • 2014-12-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多