如何用tidyr将R语言患者数据转换为指定结构的纵向数据集
生成纵向数据集的解决方案
首先可以优化你原有的患者基础数据生成代码——不需要用rowwise(),rbinom()可以直接向量化处理,效率更高:
library(dplyr) library(tidyr) # 需要用到tidyr的扩展函数 set.seed(420) Pat_TNO <- 1001:1618 # 生成基础患者数据 patient_data <- data.frame(Pat_TNO = Pat_TNO) %>% mutate(trt = rbinom(n(), 1, 0.5))
接下来定义时间点:
timepoint_weeks <- c(seq(2, 12, 2), 16, 20, 24, 52) timepoint_days <- 7 * timepoint_weeks
现在有两种简单的方法生成每位患者对应10个时间点的纵向数据集:
方法1:使用crossing()函数
crossing()会自动将患者数据和时间点进行笛卡尔积匹配,生成所有组合:
longitudinal_data <- patient_data %>% crossing(timepoint_days = timepoint_days)
方法2:使用nest() + unnest()组合
先将时间点嵌套到每个患者行,再展开:
longitudinal_data <- patient_data %>% mutate(timepoint_days = list(timepoint_days)) %>% unnest(timepoint_days)
两种方法最终都会生成包含Pat_TNO、trt、timepoint_days三列的数据集,每位患者对应10行数据,每行对应一个时间点。
内容的提问来源于stack exchange,提问作者jackahall
相关产品推荐
相关产品推荐

