我试图找到一种更简单的方法来计算使用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
这是我做的,这似乎是一个很令人费解的方式,首先我得到的值VAR在TIME等于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两个不同TIME的CAR
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?
谢谢!
这可以通过将“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)