使用 dplyr 计算变量变化的更简单方法?

SN2*_*248 3 r dplyr

我试图找到一种更简单的方法来计算使用dplyr. 我的玩具数据集是这样的

structure(list(CAR = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 
2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("a", 
"b", "c", "d", "e", "f"), class = "factor"), TIME = c(0L, 0L, 
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L
), VAR = c(20L, 30L, 40L, 50L, 60L, 70L, 30L, 40L, 50L, 60L, 
70L, 80L, 40L, 50L, 60L, 70L, 80L, 90L)), .Names = c("CAR", "TIME", 
"VAR"), class = "data.frame", row.names = c(NA, -18L))
Run Code Online (Sandbox Code Playgroud)

看起来像

   CAR TIME VAR
1    a    0  20
2    b    0  30
3    c    0  40
4    d    0  50
5    e    0  60
6    f    0  70
7    a    1  30
8    b    1  40
9    c    1  50
10   d    1  60
11   e    1  70
12   f    1  80
13   a    2  40
14   b    2  50
15   c    2  60
16   d    2  70
17   e    2  80
18   f    2  90
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算等于和其他时间VAR之间的变化,例如,对于每个.TIME01,2CAR

这是我做的,这似乎是一个很令人费解的方式,首先我得到的值VARTIME等于0

library(dplyr)
X <- local_test %>% filter(TIME == 0)  %>% group_by(CAR)  %>% mutate(baseline_VAR = VAR)
Run Code Online (Sandbox Code Playgroud)

X 好像

Source: local data frame [6 x 4]
Groups: CAR

  CAR TIME VAR baseline_VAR
1   a    0  20           20
2   b    0  30           30
3   c    0  40           40
4   d    0  50           50
5   e    0  60           60
6   f    0  70           70
Run Code Online (Sandbox Code Playgroud)

然后,我left_join用原始数据框做一个local_test

Y  <- left_join(local_test, X, by = c("CAR"))
Run Code Online (Sandbox Code Playgroud)

Y 好像

   CAR TIME.x VAR.x TIME.y VAR.y baseline_VAR
1    a      0    20      0    20           20
2    b      0    30      0    30           30
3    c      0    40      0    40           40
4    d      0    50      0    50           50
5    e      0    60      0    60           60
6    f      0    70      0    70           70
7    a      1    30      0    20           20
8    b      1    40      0    30           30
9    c      1    50      0    40           40
10   d      1    60      0    50           50
11   e      1    70      0    60           60
12   f      1    80      0    70           70
13   a      2    40      0    20           20
14   b      2    50      0    30           30
15   c      2    60      0    40           40
16   d      2    70      0    50           50
17   e      2    80      0    60           60
18   f      2    90      0    70           70
Run Code Online (Sandbox Code Playgroud)

最后,我在 中添加一列Y,它计算VAR两个不同TIMECAR

Y %>% group_by(CAR) %>% mutate(change_VAR = VAR.x - baseline_VAR)
Run Code Online (Sandbox Code Playgroud)

最终Y看起来像

Source: local data frame [18 x 7]
Groups: CAR

   CAR TIME.x VAR.x TIME.y VAR.y baseline_VAR change_VAR
1    a      0    20      0    20           20          0
2    b      0    30      0    30           30          0
3    c      0    40      0    40           40          0
4    d      0    50      0    50           50          0
5    e      0    60      0    60           60          0
6    f      0    70      0    70           70          0
7    a      1    30      0    20           20         10
8    b      1    40      0    30           30         10
9    c      1    50      0    40           40         10
10   d      1    60      0    50           50         10
11   e      1    70      0    60           60         10
12   f      1    80      0    70           70         10
13   a      2    40      0    20           20         20
14   b      2    50      0    30           30         20
15   c      2    60      0    40           40         20
16   d      2    70      0    50           50         20
17   e      2    80      0    60           60         20
18   f      2    90      0    70           70         20
Run Code Online (Sandbox Code Playgroud)

这看起来像是很多额外的工作,额外的列被添加到原始数据框中。我需要对一个大数据帧重复执行此操作。有没有更简单(一步)的计算方法change_VAR

谢谢!

akr*_*run 5

这可以通过将“VAR”与min按“CAR”分组的“VAR”的差值来完成。

local_test %>%
     group_by(CAR) %>%
     mutate(change_VAR= VAR- min(VAR))
Run Code Online (Sandbox Code Playgroud)

或者,如果 'VAR' 的基值是当 'TIME' 为 0 时(假设每组没有重复的 'TIME'),我们将 'VAR' 子集为 TIME 0 并得到差异。

local_test %>% 
      group_by(CAR) %>%
      mutate(change_VAR= VAR- VAR[TIME==0])
Run Code Online (Sandbox Code Playgroud)