假设每ID组,可能有多个time负值,也可能没有负值,我们就以time最小值作为基线。
做了个示例数据money.csv:
ID time DV
1 111001 -0.05 6.8
2 111001 0.00 0.0
3 111001 1.00 6.0
4 111001 2.00 5.3
5 111001 4.00 4.8
6 110100 1.00 2.7
7 110100 3.00 8.0
8 110100 2.00 4.0
9 110100 -0.03 6.0
10 110100 -0.04 2.0
11 110101 -0.30 3.0
12 110101 2.00 9.0
13 110101 4.00 1.0
14 111111 -0.40 7.0
15 111111 1.00 10.0
16 111111 2.00 2.0
17 111111 3.00 3.0
应该和你的数据差不多吧,这里ID是没有排序的,所以处理时需留意。
代码差不多是这样的
- library(dplyr)
- money<-read.csv("money.csv",header=T)
- #按组寻找基线
- groupBaseline <-
- money %>%
- group_by(ID) %>%
- filter(time == min(time)) %>%
- arrange(ID)
- #计算各组行数
- gCount <-
- money %>%
- group_by(ID) %>%
- summarise(n = n()) %>%
- arrange(ID)
- #添加新列
- new <-
- money %>%
- arrange(ID) %>%
- mutate(DDV = (DV - rep(groupBaseline$DV, gCount$n)))
- #DDV中小于等于零的都改为0
- new[which(new[, 2] <= 0), 4] <- 0
复制代码
代码在这里可能存在现实问题,是美元符号的原因。正确的代码显示,可以看下面的图: