R在不平衡时间序列数据框中创建滞后变量
R create lag variable in unbalance time series dataframe
我想在我的数据框中创建一个滞后变量。
我有一份时间清单c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")
。
我的数据框看起来像:
ID
TIME
VALUE
1
20110127
3.23
1
20110128
4.57
1
20110130
3.22
1
20110131
4.33
1
20110202
5.23
2
20110127
0.86
2
20110128
7.55
2
20110129
1.24
2
20110201
3.69
table 中的年份不是连续的。我想 group_by ID 然后创建一个一天的滞后变量。看起来像这样:
ID
TIME
VALUE
LAG
1
20110127
3.23
NA
1
20110128
4.57
3.23
1
20110130
3.22
NA
1
20110131
4.33
3.22
1
20110201
1.22
4.33
1
20110202
5.23
1.22
2
20110127
0.86
NA
2
20110128
7.55
0.86
2
20110129
1.24
7.55
2
20110201
3.69
NA
我试过了
alltime = c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")
last_day = data %>%
arrange(ID, TIME) %>%
group_by(ID) %>%
mutate(lagtime = alltime[which(alltime == TIME)+1], lagoutput = value ,value = NULL)
data %>%
left_join(last_day)
但 mutate 函数似乎在这里不起作用。可能是 alltime[which(alltime == TIME)+1]
的问题,我无法创建延迟。
感谢任何评论。
我们可以使用 ifelse
语句。因此,如果行相隔 1 天(这里我使用 lubridate
转换为时间格式),则 return lag
value
如果不是 return NA
.
library(tidyverse)
library(lubridate)
df %>%
arrange(ID, TIME) %>%
group_by(ID) %>%
mutate(LAG = ifelse(ymd(TIME) - lag(ymd(TIME)) == 1, lag(VALUE), NA))
输出
ID TIME VALUE LAG
<int> <int> <dbl> <dbl>
1 1 20110127 3.23 NA
2 1 20110128 4.57 3.23
3 1 20110130 3.22 NA
4 1 20110131 4.33 3.22
5 1 20110201 1.22 4.33
6 1 20110202 5.23 1.22
7 2 20110127 0.86 NA
8 2 20110128 7.55 0.86
9 2 20110129 1.24 7.55
10 2 20110201 3.69 NA
数据
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
TIME = c(20110127L, 20110128L, 20110130L, 20110131L, 20110201L,
20110202L, 20110127L, 20110128L, 20110129L, 20110201L), VALUE = c(3.23,
4.57, 3.22, 4.33, 1.22, 5.23, 0.86, 7.55, 1.24, 3.69)), class = "data.frame", row.names = c(NA,
-10L))
您可以使用 diff()
和 lubridate::ymd()
来制作一个临时列,指示日期中是否存在间隔;然后利用该差距获得 VALUE
的条件滞后
data %>%
group_by(ID) %>%
mutate(g = c(0,diff(lubridate::ymd(TIME))),
LAG = if_else(g==1,lag(VALUE),as.double(NA))) %>%
select(-g)
输出:
ID TIME VALUE LAG
<int> <int> <dbl> <dbl>
1 1 20110127 3.23 NA
2 1 20110128 4.57 3.23
3 1 20110130 3.22 NA
4 1 20110131 4.33 3.22
5 1 20110202 5.23 NA
6 2 20110127 0.86 NA
7 2 20110128 7.55 0.86
8 2 20110129 1.24 7.55
9 2 20110201 3.69 NA
我想在我的数据框中创建一个滞后变量。
我有一份时间清单c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")
。
我的数据框看起来像:
ID | TIME | VALUE |
---|---|---|
1 | 20110127 | 3.23 |
1 | 20110128 | 4.57 |
1 | 20110130 | 3.22 |
1 | 20110131 | 4.33 |
1 | 20110202 | 5.23 |
2 | 20110127 | 0.86 |
2 | 20110128 | 7.55 |
2 | 20110129 | 1.24 |
2 | 20110201 | 3.69 |
table 中的年份不是连续的。我想 group_by ID 然后创建一个一天的滞后变量。看起来像这样:
ID | TIME | VALUE | LAG |
---|---|---|---|
1 | 20110127 | 3.23 | NA |
1 | 20110128 | 4.57 | 3.23 |
1 | 20110130 | 3.22 | NA |
1 | 20110131 | 4.33 | 3.22 |
1 | 20110201 | 1.22 | 4.33 |
1 | 20110202 | 5.23 | 1.22 |
2 | 20110127 | 0.86 | NA |
2 | 20110128 | 7.55 | 0.86 |
2 | 20110129 | 1.24 | 7.55 |
2 | 20110201 | 3.69 | NA |
我试过了
alltime = c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")
last_day = data %>%
arrange(ID, TIME) %>%
group_by(ID) %>%
mutate(lagtime = alltime[which(alltime == TIME)+1], lagoutput = value ,value = NULL)
data %>%
left_join(last_day)
但 mutate 函数似乎在这里不起作用。可能是 alltime[which(alltime == TIME)+1]
的问题,我无法创建延迟。
感谢任何评论。
我们可以使用 ifelse
语句。因此,如果行相隔 1 天(这里我使用 lubridate
转换为时间格式),则 return lag
value
如果不是 return NA
.
library(tidyverse)
library(lubridate)
df %>%
arrange(ID, TIME) %>%
group_by(ID) %>%
mutate(LAG = ifelse(ymd(TIME) - lag(ymd(TIME)) == 1, lag(VALUE), NA))
输出
ID TIME VALUE LAG
<int> <int> <dbl> <dbl>
1 1 20110127 3.23 NA
2 1 20110128 4.57 3.23
3 1 20110130 3.22 NA
4 1 20110131 4.33 3.22
5 1 20110201 1.22 4.33
6 1 20110202 5.23 1.22
7 2 20110127 0.86 NA
8 2 20110128 7.55 0.86
9 2 20110129 1.24 7.55
10 2 20110201 3.69 NA
数据
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
TIME = c(20110127L, 20110128L, 20110130L, 20110131L, 20110201L,
20110202L, 20110127L, 20110128L, 20110129L, 20110201L), VALUE = c(3.23,
4.57, 3.22, 4.33, 1.22, 5.23, 0.86, 7.55, 1.24, 3.69)), class = "data.frame", row.names = c(NA,
-10L))
您可以使用 diff()
和 lubridate::ymd()
来制作一个临时列,指示日期中是否存在间隔;然后利用该差距获得 VALUE
data %>%
group_by(ID) %>%
mutate(g = c(0,diff(lubridate::ymd(TIME))),
LAG = if_else(g==1,lag(VALUE),as.double(NA))) %>%
select(-g)
输出:
ID TIME VALUE LAG
<int> <int> <dbl> <dbl>
1 1 20110127 3.23 NA
2 1 20110128 4.57 3.23
3 1 20110130 3.22 NA
4 1 20110131 4.33 3.22
5 1 20110202 5.23 NA
6 2 20110127 0.86 NA
7 2 20110128 7.55 0.86
8 2 20110129 1.24 7.55
9 2 20110201 3.69 NA