我有一个以下数据框,代表纵向数据:
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,然后再转换为长格式。但是,由于我的实际数据集明显更大,而且我有更多变量,因此变得很麻烦。您能否建议一种从长格式数据框中提取基线数据的更简单方法。
答案 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]))