为 r 中的两个条件分组的多个列创建滞后变量

Create lagged variables for several columns group by two conditions in r

提问人:cliu 提问时间:2/7/2023 更新时间:2/7/2023 访问量:38

问:

我想为按两个条件分组的几列创建滞后变量。

下面是数据集:

df <- data.frame(id = c(rep(1,4),rep(2,4)), tp = rep(1:4,2), x1 = 1:8, x2 = 2:9, x3 = 3:10, x4 = 4:11)
> df
  id tp x1 x2 x3 x4
1  1  1  1  2  3  4
2  1  2  2  3  4  5
3  1  3  3  4  5  6
4  1  4  4  5  6  7
5  2  1  5  6  7  8
6  2  2  6  7  8  9
7  2  3  7  8  9 10
8  2  4  8  9 10 11

我想滞后按 和 分组并创建新变量,如下所示:x1, x2, x3, x4idtpx1_lag1, x2_lag1, x3_lag1, x4_lag1

> df
  id tp x1 x2 x3 x4  x1_lag1 x2_lag1 x3_lag1 x4_lag1
1  1  1  1  2  3  4     2       3       4       5
2  1  2  2  3  4  5     3       4       5       6
3  1  3  3  4  5  6     4       5       6       7
4  1  4  4  5  6  7     NA      NA      NA      NA
5  2  1  5  6  7  8     6       7       8       9
6  2  2  6  7  8  9     7       8       9       10
7  2  3  7  8  9 10     8       9       10      11
8  2  4  8  9 10 11     NA      NA      NA      NA

如何实现?

r dplyr 操作 数据 清理

评论


答:

1赞 Gregor Thomas 2/7/2023 #1

您的结果似乎根本没有分组。它按分组方式进行分组,并在分组内按分组进行排序。tpidtpid

通常,“滞后”是从上一行中获取值的变量。要标记为“滞后”列的列从下一行获取值,因此我们使用该函数。lead

library(dplyr)
df %>%
  group_by(id) %>%
  mutate(across(starts_with("x"), lead, .names = "{.col}_lag1")) %>%
  ungroup()
# A tibble: 8 × 10
     id    tp    x1    x2    x3    x4 x1_lag1 x2_lag1 x3_lag1 x4_lag1
  <dbl> <int> <int> <int> <int> <int>   <int>   <int>   <int>   <int>
1     1     1     1     2     3     4       2       3       4       5
2     1     2     2     3     4     5       3       4       5       6
3     1     3     3     4     5     6       4       5       6       7
4     1     4     4     5     6     7      NA      NA      NA      NA
5     2     1     5     6     7     8       6       7       8       9
6     2     2     6     7     8     9       7       8       9      10
7     2     3     7     8     9    10       8       9      10      11
8     2     4     8     9    10    11      NA      NA      NA      NA