从长格式数据框中提取基线值

DSS*_*SSS 2 r

我有一个以下数据框,代表纵向数据:

 df<-structure(list(ID = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), AGE = c(59, 
 59, 59, 59, 59, 69, 69, 69, 69, 69), BMI = c(23.8, 23.8, 23.8, 
 23.8, 23.8, 29.8, 29.8, 29.8, 29.8, 29.8), time = c(0, 1, 3, 
 5, 6, 0, 1, 3, 5, 6), variable = c(5, 6, 1, 6, 2, 3, 2, NA, 10, 
 1)), .Names = c("ID", "AGE", "BMI", "time", "var"), row.names = c(NA, 
 10L), class = "data.frame")

   > df
      ID AGE  BMI time      var
   1   1  59 23.8    0        5
   2   1  59 23.8    1        6
   3   1  59 23.8    3        1
   4   1  59 23.8    5        6
   5   1  59 23.8    6        2
   6   2  69 29.8    0        3
   7   2  69 29.8    1        2
   8   2  69 29.8    3       NA
   9   2  69 29.8    5       10
   10  2  69 29.8    6        1
Run Code Online (Sandbox Code Playgroud)

AGE和BMI是基线变量,var是在不同时间点(时间)测量的纵向变量。我想从 var 变量中提取基线(时间 = 0)数据并创建新的基线变量 var.baseline。我的数据框看起来像

   > df
     ID AGE  BMI time variable var.baseline
 1   1  59 23.8    0        5            5
 2   1  59 23.8    1        6            5
 3   1  59 23.8    3        1            5
 4   1  59 23.8    5        6            5
 5   1  59 23.8    6        2            5
 6   2  69 29.8    0        3            3
 7   2  69 29.8    1        2            3
 8   2  69 29.8    3       NA            3
 9   2  69 29.8    5       10            3
 10  2  69 29.8    6        1            3
Run Code Online (Sandbox Code Playgroud)

当然,我可以将数据转换为宽格式,基于variable.0创建var.baseline,然后再次转换为长格式。然而,由于我的真实数据集明显更大并且变量更多,所以它变得很麻烦。您能否建议一种更简单的方法来从长格式数据框中提取基线数据。

akr*_*run 5

你可以试试

library(dplyr)
df %>%
    group_by(ID) %>% 
    mutate(var.baseline=var[time==0])
Run Code Online (Sandbox Code Playgroud)

或者

library(data.table)
 setDT(df)[,var.baseline:=var[time==0] , by=ID]
Run Code Online (Sandbox Code Playgroud)

或者使用base R

 merge(df,setNames(subset(df, time==0,select=c("ID", "var")),
                c('ID', 'var.baseline')), by='ID')
Run Code Online (Sandbox Code Playgroud)

或者

 library(zoo)
 df$var.baseline <- with(df, na.locf(var[!NA^time==0]))
Run Code Online (Sandbox Code Playgroud)