You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:57