是否有可能滞后 r 中按时间索引的数据帧的值?
Is there a possibility to lag values of a data frame in r indexed by time?
我的问题涉及 r 中的滞后数据,其中 r 应该知道时间索引。我希望这个问题没有在任何进一步的线程中被问到。让我们考虑一个简单的设置:
df <- data.frame(date=as.Date(c("1990-01-01","1990-02-01","1990-01-15","1990-03-01","1990-05-01","1990-07-01","1993-01-02")), value=1:7)
这段代码应该生成一个 table 像
date
value
1990-01-01
1
1990-02-01
2
1990-01-15
3
1990-03-01
4
1990-05-01
5
1990-07-01
6
我现在的目标是尝试将“价值”滞后于例如一个月,例如,当我尝试计算“1990-05-01”的滞后值(应该是 1990-04-01 但不存在于数据中)时,应该在特定行中生成一个 NA。当我使用标准滞后函数时,r 不知道时间索引,只是使用 1990-03-01 的值“4”,这不是我想要的。有人知道我可以在这里做什么吗?
提前致谢! :)
祝一切顺利,
里昂
您可以尝试 %m-%
如下所示的滞后月份
library(lubridate)
transform(
df,
value_lag = value[match(date %m-% months(1), date)]
)
这给出了
date value value_lag
1 1990-01-01 1 NA
2 1990-02-01 2 1
3 1990-01-15 3 NA
4 1990-03-01 4 2
5 1990-05-01 5 NA
6 1990-07-01 6 NA
7 1993-01-02 7 NA
对于多列的示例,让我们考虑:
df <- data.frame(date=as.Date(c("1990-01-01","1990-02-01","1990-01-15","1990-03-01","1990-05-01","1990-07-01","1993-01-02")), value=1:7, value2=7:13)
我最近找到了以下解决方案:
df %>%
as_tibble() %>%
mutate(across(2:ncol(df), .fns= function(x){x[match(date %m-% months(lags),date)]}, .names="{.col}_lag"))
感谢您的代码@ThomasisCoding。 :)
我的问题涉及 r 中的滞后数据,其中 r 应该知道时间索引。我希望这个问题没有在任何进一步的线程中被问到。让我们考虑一个简单的设置:
df <- data.frame(date=as.Date(c("1990-01-01","1990-02-01","1990-01-15","1990-03-01","1990-05-01","1990-07-01","1993-01-02")), value=1:7)
这段代码应该生成一个 table 像
date | value |
---|---|
1990-01-01 | 1 |
1990-02-01 | 2 |
1990-01-15 | 3 |
1990-03-01 | 4 |
1990-05-01 | 5 |
1990-07-01 | 6 |
我现在的目标是尝试将“价值”滞后于例如一个月,例如,当我尝试计算“1990-05-01”的滞后值(应该是 1990-04-01 但不存在于数据中)时,应该在特定行中生成一个 NA。当我使用标准滞后函数时,r 不知道时间索引,只是使用 1990-03-01 的值“4”,这不是我想要的。有人知道我可以在这里做什么吗?
提前致谢! :)
祝一切顺利,
里昂
您可以尝试 %m-%
如下所示的滞后月份
library(lubridate)
transform(
df,
value_lag = value[match(date %m-% months(1), date)]
)
这给出了
date value value_lag
1 1990-01-01 1 NA
2 1990-02-01 2 1
3 1990-01-15 3 NA
4 1990-03-01 4 2
5 1990-05-01 5 NA
6 1990-07-01 6 NA
7 1993-01-02 7 NA
对于多列的示例,让我们考虑:
df <- data.frame(date=as.Date(c("1990-01-01","1990-02-01","1990-01-15","1990-03-01","1990-05-01","1990-07-01","1993-01-02")), value=1:7, value2=7:13)
我最近找到了以下解决方案:
df %>%
as_tibble() %>%
mutate(across(2:ncol(df), .fns= function(x){x[match(date %m-% months(lags),date)]}, .names="{.col}_lag"))
感谢您的代码@ThomasisCoding。 :)