【发布时间】:2019-12-01 07:07:14
【问题描述】:
在我的示例中,我有一个包含 3 列的数据框:日期、信号和值。现在我想改变以信号为条件的新列。
如果前一天有信号 (ifelse(lag(signal) == 1),那么在第二天的第一天给我,然后在下一栏中给我第二天的第一天和第二天 (else = NA)。
但在这种情况下,我有三个不同的信号 (c(1,2,3))。
我想要一个动态的解决方案。这意味着我可以计算接下来的天数(因为在我的实际情况下,我想使用接下来的 7 天)以及信号数。
这是我的示例数据:
library(tidyverse)
library(lubridate)
set.seed(123)
df <- tibble(date = today()+0:10,
signal = c(0,1,0,0,2,0,0,3,0,0,0),
value = sample.int(n=11))
# A tibble: 11 x 3
date signal value
<date> <dbl> <int>
1 2019-07-23 0 3
2 2019-07-24 1 11
3 2019-07-25 0 2
4 2019-07-26 0 6
5 2019-07-27 2 10
6 2019-07-28 0 5
7 2019-07-29 0 4
8 2019-07-30 3 9
9 2019-07-31 0 8
10 2019-08-01 0 1
11 2019-08-02 0 7
这是我想要的输出:
# A tibble: 11 x 3
date signal value new_col_day1_sig_1 new_col_day2_sig_1 new_col_day1_sig_2 new_col_day2_sig_2 new_col_day1_sig_3 new_col_day2_sig_3
<date> <dbl> <int>
1 2019-07-23 0 3 NA NA NA NA NA NA
2 2019-07-24 1 11 NA NA NA NA NA NA
3 2019-07-25 0 2 2 2 NA NA NA NA
4 2019-07-26 0 6 NA 6 NA NA NA NA
5 2019-07-27 2 10 NA NA NA NA NA NA
6 2019-07-28 0 5 NA NA 5 5 NA NA
7 2019-07-29 0 4 NA NA NA 4 NA NA
8 2019-07-30 3 9 NA NA NA NA NA NA
9 2019-07-31 0 8 NA NA NA NA 8 8
10 2019-08-01 0 1 NA NA NA NA NA 1
11 2019-08-02 0 7 NA NA NA NA NA NA
我已经问过同样的问题,但没有不同的信号:
R Extracting following days after signal in time series
这是一个只针对一个信号的解决方案:
anylag <- function(x, n) {
l <- lapply(1:n, function(i) lag(x, i) == 1)
Reduce("|", l)
}
df %>% mutate(calculation=ifelse(anylag(signal, 3), value, NA))
但现在我想实现信号。 解决方案应该类似于:
signals<-c(1,2,3)
anylag <- function(x, n, signals) {
l <- lapply(1:n, function(i) lag(x, i) == 1 * signals)
Reduce("|", l)
}
【问题讨论】:
标签: r dplyr time-series