R语言中Spell Data转长格式:生成含时间与存在标识的数据集
Spell数据长格式重塑方案
原始数据说明
我有一组Spell数据,包含ID、group(组标识)和spell_length(持续时长)三个字段,示例数据生成代码如下:
d <- data.frame(ID = 1:10, group = sample(c("a", "b"), 10, replace = T), spell_length = sample(1:3,10, replace = T))
查看前6行数据结果:
ID group spell_length 1 b 1 2 a 1 3 a 3 4 b 1 5 a 1 6 b 2
需求说明
需要将上述数据重塑为长格式,最终包含4个变量:
- ID:原数据ID
- group:原数据组标识
- time:取值范围为1至原数据中最大的spell_length(示例中为1-3)
- indicator:取值0或1,标识对应ID在该time点是否仍处于spell中(例如spell_length为1时,time=2和3的indicator为0)
预期输出示例如下:
ID group time indicator 1 b 1 1 1 b 2 0 1 b 3 0 2 a 1 1 2 a 2 0 2 a 3 0 3 a 1 1 3 a 2 1 3 a 3 1
解决方案
可以用tidyr和dplyr包实现,步骤如下:
- 确定原始数据中最大的spell_length值
- 为每个ID扩展出1到最大时长的time序列
- 计算indicator:当time ≤ spell_length时为1,否则为0
代码实现:
library(tidyr) library(dplyr) # 确定最大时长 max_spell <- max(d$spell_length) # 重塑数据 result <- d %>% # 为每个ID扩展time列,从1到max_spell uncount(max_spell, .id = "time") %>% # 计算indicator mutate(indicator = as.integer(time <= spell_length)) %>% # 按ID和time排序 arrange(ID, time) # 查看结果 head(result, 9)
运行后即可得到符合要求的长格式数据。
内容的提问来源于stack exchange,提问作者jkortner
相关产品推荐
相关产品推荐

