R语言如何将三个时间点数据框合并为长格式数据框
R多时间点数据框直接合并为长格式方法
不需要先转宽格式再整形,也不需要手动枚举所有变量名,用tidyverse的行合并+按组填充即可实现,全程自动识别所有变量。
实现逻辑
- 先给每个时间点的数据集标记对应的测量时间,直接纵向合并所有数据集
- 按受访者ID分组,对所有列的缺失值做双向填充:时变变量(var1、var2等)每个时间点本身有观测值,不会被修改;固定变量(gender、job等)每个ID仅在某一个时间点有记录,会自动填充到该ID的所有时间行
- 排序整理后即可得到目标长表
可直接运行的代码
# 加载依赖包 library(tidyverse) # -------------------------- # 此处替换为你自己的三个数据框 # 示例数据构造(和给出的样例一致) data1 <- tibble( ID = c(1,2,3), var1 = c(1,2,1), var2 = c(1,2,3), var3 = c(1,2,3), job = c(2,3,4), gender = c(0,1,0) ) data2 <- tibble( ID = c(1,2,3), var1 = c(3,3,1), var2 = c(2,1,3), var3 = c(3,2,3) ) data3 <- tibble( ID = c(1,2,3), var1 = c(1,2,1), var2 = c(2,2,3), var3 = c(1,2,3), happy = c(1,3,4), income = c(5,1,9) ) # -------------------------- # 核心合并代码 combine_long <- list( "1" = data1, "2" = data2, "3" = data3 ) %>% # 自动为每个数据集添加time标记后纵向合并,无需手动指定列 bind_rows(.id = "time") %>% mutate(time = as.numeric(time)) %>% # 按ID分组补全固定变量 group_by(ID) %>% # 双向填充所有列的缺失值,固定变量自动补全,时变变量不受影响 fill(everything(), .direction = "downup") %>% # 按ID、时间排序,调整列顺序 arrange(ID, time) %>% ungroup() %>% select(ID, time, everything())
结果说明
运行后得到的combine_long完全符合需求,var1/var2/var3自动取对应时间点的真实观测值,job/gender/happy/income等固定变量自动填充到每个ID的所有时间行,不需要手动写任何变量名,哪怕单份数据有上百个变量也可以直接运行。
注意:使用前请确认同一个ID对应的固定变量取值在不同时间点没有冲突,如果存在取值不一致的情况,填充时会优先保留最先读取到的值,建议提前做一致性校验。如果后续有更多时间点的数据,只需要把新的数据框加入上方的
list()结构中,设置好对应的时间标签即可,不需要修改其他合并逻辑。
内容的提问来源于stack exchange,提问作者Susan
相关产品推荐
相关产品推荐

