使用tidyr替代dmutate包mutate_random创建PKPD采样数据集的方法问询
替代方案
你当前使用的mutate_random的场景为独立从data_pkpd的各参数列有放回采样生成个体参数表,直接用tidyverse体系下的dplyr+tidyr即可实现,不需要依赖dmutate包。
方案1:和原逻辑完全对齐的逐列写法
该写法与你原有代码逻辑100%一致,采样结果的统计特性完全相同,仅替换了依赖包的函数:
library(tidyverse) NSIM <- 100 idata_SIM0 <- tidyr::crossing(ID = 1:NSIM) %>% mutate(GRP = 1) %>% # 如需添加WT列可取消注释下一行 # mutate(WT = rep(seq(41, 120, 1), each = 200)) %>% mutate(CL = sample(data_pkpd$ICL, size = NSIM, replace = TRUE)) %>% mutate(Q = sample(data_pkpd$IQ, size = NSIM, replace = TRUE)) %>% mutate(V2 = sample(data_pkpd$IV2, size = NSIM, replace = TRUE)) %>% mutate(V3 = sample(data_pkpd$IV3, size = NSIM, replace = TRUE)) %>% mutate(V7 = sample(data_pkpd$IV7, size = NSIM, replace = TRUE)) %>% mutate(Q2 = sample(data_pkpd$IQ2, size = NSIM, replace = TRUE)) %>% mutate(KA = sample(data_pkpd$IKA, size = NSIM, replace = TRUE)) %>% mutate(F1 = sample(data_pkpd$IF1, size = NSIM, replace = TRUE)) %>% mutate(BL_PD = sample(data_pkpd$BL_PD, size = NSIM, replace = TRUE)) %>% mutate(time = 0)
方案2:基于tidyr+dplyr的批量简洁写法
如果后续需要添加更多采样参数,不需要逐行写mutate,可通过批量映射减少重复代码:
library(tidyverse) NSIM <- 100 # 定义需要采样的参数对应关系,左边为新列名,右边为data_pkpd中的源列名 param_map <- c( CL = "ICL", Q = "IQ", V2 = "IV2", V3 = "IV3", V7 = "IV7", Q2 = "IQ2", KA = "IKA", F1 = "IF1", BL_PD = "BL_PD" ) idata_SIM0 <- tidyr::crossing(ID = 1:NSIM) %>% mutate(GRP = 1, time = 0) %>% # 批量采样所有参数 mutate( across(all_of(names(param_map)), ~ sample(data_pkpd[[param_map[cur_column()]]], size = NSIM, replace = TRUE)) )
新增采样参数仅需在param_map中添加对应关系即可,维护成本更低。
内容的提问来源于stack exchange,提问作者Ravua1992
相关产品推荐
相关产品推荐

