ifelse() 函数 - 参考第二天
ifelse() function - refer to the following day
我有一个包含 2 列的数据框:日期和 return。
df <- tibble(
date = lubridate::today() +0:9,
return= c(1,2.5,2,3,5,6.5,1,9,3,2))
现在我想添加带有 ifelse 条件的第三列。
如果第 t 天的 return 高于 3.5,则在随后的第 t+1 天重新运行是 NA(否则 = 第 t 天的 return)。
这是我想要的输出:
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
有人可以描述一下我如何制定这个条件吗?
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
使用 lag
和 dplyr
中的 mutate
。对于滞后,我们将前一行的 return
值与 3.5
进行比较:如果它大于或等于我们取 NA
,如果它更小我们取 return 值当前行
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
使用 ifelse 的简单解决方案
df$return_sub_day <- ifelse(dplyr::lag(df$return) > 3.5, NA ,df$return)
df$return_sub_day[1] <- df$return[1]
data table 方式,对更大的数据集有效-
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
混淆,但简短有趣:
df$return_subsequent_day <- df$return * lag(df$return < 3.5, 1, 1)^NA
我有一个包含 2 列的数据框:日期和 return。
df <- tibble(
date = lubridate::today() +0:9,
return= c(1,2.5,2,3,5,6.5,1,9,3,2))
现在我想添加带有 ifelse 条件的第三列。 如果第 t 天的 return 高于 3.5,则在随后的第 t+1 天重新运行是 NA(否则 = 第 t 天的 return)。
这是我想要的输出:
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
有人可以描述一下我如何制定这个条件吗?
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
使用 lag
和 dplyr
中的 mutate
。对于滞后,我们将前一行的 return
值与 3.5
进行比较:如果它大于或等于我们取 NA
,如果它更小我们取 return 值当前行
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
使用 ifelse 的简单解决方案
df$return_sub_day <- ifelse(dplyr::lag(df$return) > 3.5, NA ,df$return)
df$return_sub_day[1] <- df$return[1]
data table 方式,对更大的数据集有效-
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
混淆,但简短有趣:
df$return_subsequent_day <- df$return * lag(df$return < 3.5, 1, 1)^NA