通过过滤数据以获取时间点作为值,将 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 只有一个日期,因此所有日期列都可以折叠为一列。
我还想指出,这不是数据的理想结构,所以也许您最好的办法是尝试说服您的客户!
我有 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 只有一个日期,因此所有日期列都可以折叠为一列。
我还想指出,这不是数据的理想结构,所以也许您最好的办法是尝试说服您的客户!