如何在RStudio中按指定时间序列扩展含ID、OCC、DOSE的数据框?
实现数据扩展的几种常用方法
嘿,这个需求其实在数据处理里挺常见的——给每个ID-OCC-DOSE的组合匹配所有指定的TIME值,生成扩展后的数据集对吧?在R里有好几种简单又高效的实现方式,我给你列几个最常用的:
方法1:使用tidyverse的expand()(最直观)
如果你平时用tidyverse生态的工具,这个方法逻辑最清晰,直接生成所有组合:
library(tidyverse) times <- c(2,4) dfin <- data.frame( ID = c(1,1,2), OCC = c(1,2,1), DOSE = c(0.1,0.2,0.1) ) dfout <- dfin %>% expand(nesting(ID, OCC, DOSE), TIME = times)
这里nesting(ID, OCC, DOSE)用来保留原数据中已经存在的ID-OCC-DOSE唯一组合,再和times里的每个值做笛卡尔积,正好生成你需要的结果。
方法2:tidyverse的mutate() + unnest()(更简洁)
这个方法步骤更少,先给每行添加一个包含所有TIME值的列表列,再展开成多行:
dfout <- dfin %>% mutate(TIME = list(times)) %>% unnest(TIME)
list(times)会把整个times向量作为一个列表元素绑定到每行,unnest()则会把这个列表列拆成多行,原有的ID/OCC/DOSE会自动重复对应次数。
方法3:Base R实现(无需额外包)
如果你不想加载第三方包,用Base R的merge()也能搞定:
times <- c(2,4) dfin <- data.frame( ID = c(1,1,2), OCC = c(1,2,1), DOSE = c(0.1,0.2,0.1) ) # 先提取ID-OCC-DOSE的唯一组合 unique_groups <- unique(dfin[, c("ID", "OCC", "DOSE")]) # 和TIME值做笛卡尔积合并 dfout <- merge(unique_groups, data.frame(TIME = times), by = NULL) # 按ID和OCC排序,和示例结果一致 dfout <- dfout[order(dfout$ID, dfout$OCC), ] row.names(dfout) <- NULL # 重置行名消除排序后的索引混乱
方法4:data.table实现(高性能)
如果你的数据集很大,data.table的方法会更快:
library(data.table) times <- c(2,4) dfin <- data.frame( ID = c(1,1,2), OCC = c(1,2,1), DOSE = c(0.1,0.2,0.1) ) setDT(dfin) # 把普通数据框转成data.table dfout <- dfin[, .(TIME = times), by = .(ID, OCC, DOSE)]
这里by = .(ID, OCC, DOSE)按分组变量拆分数据,每个组生成包含所有TIME值的列,自动合并成最终的数据集。
上面所有方法生成的dfout都和你给出的示例结果完全一致,你可以根据自己平时的工具偏好选择合适的方式~
内容的提问来源于stack exchange,提问作者Amer
相关产品推荐
相关产品推荐

