首页 > 解决方案 > 组内滞后函数

问题描述

我想编写代码来计算每个组内的滞后差异总和,如下表所示:

ID  x rank  U   R   Required Output Value
1   1   1   U1  R1  -
1   1   2   U2  R2  R2-U1
1   1   3   U3  R3  (R3-U2) + (R3-U1)
1   1   4   U4  R4  (R4-U3) + (R4-U2) + (R4-U1)
1   0   5   U5  R5  R5
1   0   6   U6  R6  R6
1   0   7   U7  R7  R7
2   1   1   U8  R8  -
2   1   2   U9  R9  R9-U8
2   1   3   U10 R10 (R10-U9) + (R10 - U8)
2   1   4   U11 R11 (R11-U10) + (R11 - U9) + (R11 - U8)
3   1   1   U12 R12 -
3   0   2   U13 R13 R13
3   0   3   U14 R14 R14

ID 是唯一的组标识符。x 是一个布尔值,根据它的值,所需的输出要么是与先前值的差值之和,要么是相同的周期值。“rank”是一个排名排序列,每个组内的最大排名可能会有所不同。“U”和“R”是感兴趣的主要列。

举一个数字示例,我需要以下内容:

ID  x rank  U   R   Required Output Value
1   1   1   10  7   -
1   1   2   9   11  1
1   1   3   10  10  1 + 0 = 1
1   1   4   11  13  3+4+3 = 10
1   0   5   7   8   8
1   0   6   8   8   8
1   0   7   5   7   7
2   1   1   3   2   -
2   1   2   9   15  12
2   1   3   13  14  16
2   1   4   1   14  17
3   1   1   12  1   -
3   0   2   14  9   9
3   0   3   1   11  11

生成此表的 R 代码:

ID = c(rep(1,7),rep(2,4),rep(3,3))
x = c(rep(1,4),rep(0,3),rep(1,5),rep(0,2))
rank = c(1:7,1:4,1:3)
U = c(10,9,10,11,7,8,5,3,9,13,1,12,14,1)
R = c(7,11,10,13,8,8,7,2,15,14,14,1,9,11)
dat = cbind(ID,x,rank,U,R)
colnames(dat)=c("ID","x","rank","U","R")

标签: rgroupinglag

解决方案


这是一个tidyverse解决方案:

library(dplyr)
library(tidyr)

dat %>%
  as_tibble() %>%
  group_by(ID) %>%
  mutate(output = ifelse(x, lag(rank) * R - lag(cumsum(U)), R))

结果:

# A tibble: 14 x 6
# Groups:   ID [3]
      ID     x  rank     U     R output
   <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
 1     1     1     1    10     7     NA
 2     1     1     2     9    11      1
 3     1     1     3    10    10      1
 4     1     1     4    11    13     10
 5     1     0     5     7     8      8
 6     1     0     6     8     8      8
 7     1     0     7     5     7      7
 8     2     1     1     3     2     NA
 9     2     1     2     9    15     12
10     2     1     3    13    14     16
11     2     1     4     1    14     17
12     3     1     1    12     1     NA
13     3     0     2    14     9      9
14     3     0     3     1    11     11

推荐阅读