通过过滤数据以获取时间点作为值,将 pre-post 重复测量的数据从长转换为宽

Convert data on pre-post repeated measures from long to wide by filtering data to get time point as value

我有 14K 行 table 370 名肝移植患者,其中包括移植日期以及在手术前后进行的各种重复实验室测试。我想获得 pre-transplant、即时 post-transplant 和 3/6/12/18/24/36 个月的实验室结果。

ID Transp Date Lab Units Lab Type Tme Lab Val
0000001 2011-01-11 VCA IgG Index 0 6487.0
0000001 2011-01-11 VCA IgM Index 0 11230.0
0000002 2011-01-03 Copies/mL CMV Quant PCR 3 100.0
0000002 2011-01-03 Copies/mL EBV Quant PCR 3 683.0.

我对移植日期和实验室测试日期进行了轮(datediff)以获得月份时间点(Tme)。我的客户希望最后的 table 每行有一条记录和所有数据值。 Headers 像这样:

ID|TrnsplDate|LabType1|Units1|PreVal|Val0|Val3|Val6|Val12|Val18|Val24|Val36|LabType2|Units2|PreVal|Val0|Val3|Val6|Val12|Val18|Val24|Val36|LabType3 |Units3|PreVal|Val0|Val3|Val6|Val12|Val18|Val24|Val36|LabType4|Units4|PreVal|Val0|Val3|Val6|Val12|Val18|Val24|Val36

任何熟悉 R 的人都可以指导我从哪里开始吗?我使用 Rstudio。提前致谢。

试试这个,它会将同一 ID 的所有内容放在一行中,然后您可以根据需要使用 colnames(df) 和索引(即 colorder <- c(2,3,5,1,7,12,...); df[, colorder] 之类的东西调整列名和顺序。

### Set up data
library(lubridate)
df <- data.frame(ID = rep(sprintf("SID%s",seq(1:2)),2),
                 transdate = seq(mdy("01/01/2000"), mdy("01/4/2000"),1),
                 labunits = c(NA, NA, rep("Copies/mL",2)),
                 labtype = c(rep("VCA IgG Index",2),"CMV Quant PCR", "EBV Quant PCR"),
                 time = c(0,0,2,2),
                 labval = sample(100:2000, 4))
# Transform
df2 <- tidyr::pivot_wider(df, names_from = labtype, values_from = -ID)

# ----------------------------
# Edit: separate by lab type
df_bylab <- split(df, df$labtype)

# output each lab type to CSV 
for(i in 1:length(df)){
  write.csv(df[i], paste0(names(df)[i], ".csv"))
}

根据提供的有限数据,我不确定是否可以折叠某些列(例如,似乎每个 SID 只有一个日期,因此所有日期列都可以折叠为一列。

我还想指出,这不是数据的理想结构,所以也许您最好的办法是尝试说服您的客户!