I have a dataset that looks something like this:
df1 <- data.frame(id = c(rep("A1",4), rep("A2",4)),
time = rep(c(0,2:4), 2),
y1 = rnorm(8),
y2 = rnorm(8))
For each of the y
variables, I want to calculate their change since time==0
. Basically, I want to do this:
calc_chage <- function(id, data){
#y1
y1_0 <- data$y1[which(data$time==0 & data$id==id)]
D2y1 <- data$y1[which(data$time==2 & data$id==id)] - y1_0
D3y1 <- data$y1[which(data$time==3 & data$id==id)] - y1_0
D4y1 <- data$y1[which(data$time==4 & data$id==id)] - y1_0
#y2
y2_0 <- data$y2[which(data$time==0 & data$id==id)]
D2y2 <- data$y2[which(data$time==2 & data$id==id)] - y2_0
D3y2 <- data$y2[which(data$time==3 & data$id==id)] - y2_0
D4y2 <- data$y2[which(data$time==4 & data$id==id)] - y2_0
#Output
out <- data.frame(id=id, delta=rep(2:4, 2),
outcome=c(rep("y1",3), rep("y2",3)),
change = c(D2y1, D3y1, D4y1,
D2y2, D3y2, D4y2))
}
library(purrr)
changes <- map(.x = unique(df1$id), .f = calc_chage, data=df1) %>%
map_df(bind_rows)
My guess is that there is a more efficient way of doing this. Alas, I cannot think of it. Suggestions?