我有一个包含三个变量的数据集:日期,信号和值。现在,我想突变一个新的列,该列以信号为条件并根据值列计算得出。
如果前一天(ifelse(lag(signal)==1
)发出信号,则计算接下来三天的平均值。
在这种情况下,我使用了以下表达式:
(value+lead(value)+lead(value,n = 2)) /3
。
所以我得到了我想要的东西:
set.seed(123)
df<-tibble(date=today()+0:10,
signal=c(0,1,0,0,0,0,1,0,0,0,0),
value= sample.int(n=11))
df%>%mutate(calculation=ifelse(lag(signal)==1,
(value+lead(value)+lead(value, n = 2)) /3,
NA))
# A tibble: 11 x 4
date signal value calculation
<date> <dbl> <int> <dbl>
1 2019-07-17 0 1 NA
2 2019-07-18 1 7 NA
3 2019-07-19 0 5 6.33
4 2019-07-20 0 4 NA
5 2019-07-21 0 10 NA
6 2019-07-22 0 2 NA
7 2019-07-23 1 9 NA
8 2019-07-24 0 3 7.33
9 2019-07-25 0 11 NA
10 2019-07-26 0 8 NA
11 2019-07-27 0 6 NA
但是我的问题是我不只是想使用接下来的3天。 我想用几天。因此,我想自动化代码并计算几列。也许带有诸如应用功能之类的东西。
这是我想要的输出(在此示例中,接下来的5天):
date signal value calc_day_1 calc_day2 calc_day3 calc_day4 calc_day5
<date> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-07-17 0 1 NA NA
2 2019-07-18 1 7 NA NA
3 2019-07-19 0 5 5 (5+4)/2=4.5
4 2019-07-20 0 4 NA NA
5 2019-07-21 0 10 NA NA
6 2019-07-22 0 2 NA NA
7 2019-07-23 1 9 NA NA
8 2019-07-24 0 3 3 (3+11)/2=7
9 2019-07-25 0 11 NA NA
10 2019-07-26 0 8 NA NA
11 2019-07-27 0 6 NA NA
有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:1)
您好,您可以按以下方式使用**p = 10
软件包和rlang
软件包:
purrr
小解释:如果您只想这些列之一(例如library(tidyverse)
myfun <- paste0("if_else(lag(signal) == 1, map_dbl(1:n(), ~mean(value[.x - 1 + 1:",
1:5 ,"])), NA_real_)") %>%
setNames(paste0("calc_day", 1:5)) %>%
purrr::map(rlang::parse_expr)
df %>%
mutate(!!! myfun)
# A tibble: 11 x 8
date signal value calc_day1 calc_day2 calc_day3 calc_day4 calc_day5
<date> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-07-17 0 3 NA NA NA NA NA
2 2019-07-18 1 11 NA NA NA NA NA
3 2019-07-19 0 2 2 4 6 5.75 5.4
4 2019-07-20 0 6 NA NA NA NA NA
5 2019-07-21 0 10 NA NA NA NA NA
6 2019-07-22 0 5 NA NA NA NA NA
7 2019-07-23 1 4 NA NA NA NA NA
8 2019-07-24 0 9 9 8.5 6 6.25 NA
9 2019-07-25 0 8 NA NA NA NA NA
10 2019-07-26 0 1 NA NA NA NA NA
11 2019-07-27 0 7 NA NA NA NA NA
),则可以执行以下操作:
calc_day2
因此,从理论上讲,您仅可以复制此行五次(每次将df %>%
mutate(calc_day2 = if_else(lag(signal) == 1, map_dbl(1:n(), ~ mean(value[.x - 1 + 1:2])), NA_real_))
替换为相应的数字)。
或者您使用2
包(另请参见this question)来获取快捷方式:)。