R语言如何遍历数据框观测值 按随访月生成年度记录并计算年龄
按年间隔展开随访记录并计算对应时间点年龄
现有R数据框存储受试者随访信息,包含3个字段:受试者ID(USUBJID)、总随访月数(follow_up)、基线年龄(AGE),原始数据构造代码如下:
df1<-structure(list(USUBJID = c(1, 2, 3), follow_up = c(24,36,56), AGE = c(65,34,65)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
原始数据预览:
# A tibble: 3 x 3 USUBJID follow_up AGE <dbl> <dbl> <dbl> 1 1 24 65 2 2 36 34 3 3 56 65
处理规则
- 为每位受试者生成从0月开始、间隔12个月的随访节点,节点最大值为不超过总随访月数的最大12的整数倍:例如总随访36个月时生成0、12、24、36四个节点,总随访56个月时最大节点为48。
- 每个节点的年龄以基线年龄为基础,每满12个月年龄加1。
处理后期望得到如下结果:
# A tibble: 12 x 3 USUBJID Month AGE <dbl> <dbl> <dbl> 1 1 0 65 2 1 12 66 3 1 24 67 4 2 0 34 5 2 12 35 6 2 24 36 7 2 36 37 8 3 0 65 9 3 12 66 10 3 24 67 11 3 36 68 12 3 48 69
实现方法
用dplyr+tidyr的行分组+列表展开逻辑可以快速实现,代码如下:
library(dplyr) library(tidyr) result <- df1 %>% rowwise(USUBJID) %>% mutate( # 生成12个月间隔的月份序列 Month = list(seq(0, floor(follow_up / 12) * 12, by = 12)), # 按年份累加计算对应年龄 AGE = list(AGE + (Month / 12)) ) %>% unnest(c(Month, AGE)) %>% select(USUBJID, Month, AGE)
逻辑说明
floor(follow_up / 12) * 12用来计算每个受试者符合要求的最大随访节点,自动过滤掉不满12个月的零散随访时长。- 按行分组后为每个受试者单独生成月份序列、计算对应年龄,存储为列表列后统一展开成长表格式,输出和期望结果完全一致。
内容的提问来源于stack exchange,提问作者MKro
相关产品推荐
相关产品推荐

