如何将含起止日期的R DataFrame转换为长格式?
解决方法
方法1:dplyr + tidyr 组合实现
先将字符型日期转换为Date类型,为每一行生成onset到end的日期序列,再展开为多行,代码如下:
library(dplyr) library(tidyr) library(purrr) df_long <- df %>% mutate( onset = as.Date(onset), end = as.Date(end), # 为每个id生成对应的日期序列 date = map2(onset, end, seq, by = "day") ) %>% # 展开日期序列列 unnest(date) %>% # 保留需要的字段 select(id, date) df_long
方法2:data.table(高效处理大数据集)
如果数据集规模较大,data.table的实现方式效率更高:
library(data.table) setDT(df)[, .(date = seq(as.Date(onset), as.Date(end), by = "day")), by = id]
原尝试失败的原因
你之前用rowwise() + unnest()没效果,大概率是未将字符型日期转换为Date类型,或是没有正确生成列表格式的日期序列。修正后的rowwise()写法如下:
df_long <- df %>% rowwise() %>% mutate( onset = as.Date(onset), end = as.Date(end), date = list(seq(onset, end, by = "day")) ) %>% unnest(date) %>% select(id, date)
内容的提问来源于stack exchange,提问作者Simón Cárdenas Robledo
相关产品推荐
相关产品推荐

