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

时间:2014-12-23 04:55:27

标签: 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

AGE和BMI是基线变量,var是在不同时间点(时间)测量的纵向变量。 我想从var变量中提取基线(time = 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

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

1 个答案:

答案 0 :(得分:4)

你可以尝试

library(dplyr)
df %>%
    group_by(ID) %>% 
    mutate(var.baseline=var[time==0])

library(data.table)
 setDT(df)[,var.baseline:=var[time==0] , by=ID]

或使用base R

 merge(df,setNames(subset(df, time==0,select=c("ID", "var")),
                c('ID', 'var.baseline')), by='ID')

或者

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