R语言迭代合并绑定相似结构数据框的方法问询
R 环境多学期学生数据合并需求与问题
基础信息
- 运行环境:R Studio(R 版本 4.0.3)的 R Markdown 环境
- 核心目标:合并23个结构相似的学期数据框,保留所有行,按学生ID主键匹配,构建跨学期学业结果追踪数据集
- 数据规模:每个学期数据框包含3000-4000条个体观测、45-47个变量;同一学生可在多个学期的数据框中重复出现(例如秋季修读101课程、春季修读102课程)
现存操作问题
- 流程报错:直接执行
full_join()管道传入filter()再传入bind_rows()的操作时,触发报错:Error: Can't combine..1$term_codecharacter and..2$term_codeinteger - 后缀冗余:多次迭代关联绑定后,非目标列会出现重复后缀(例如
section_code.db、section_code.db.db)
具体需求
- 按ID主键用
dplyr::full_join()匹配个体,通过suffix参数区分不同学期的成绩、term_gpa等动态数据所属学期 - 跨学期不变的稳定数据(ACT成绩、性别、州居住身份等)仅保留首次录入值,后期清洗冗余数据也可接受
- 每学期新增的学生个体条目,在横向关联后追加到数据集底部
现有操作代码
学期数据关联示例
初始以首个学期SP11数据定义 programmatic_database,选取需关联的列减少稳定数据重复,关联操作代码如下:
programmatic_database <- programmatic_database %>% full_join(select(fa12, id, course_code, section_code, grade, term_gpa), by = "id", copy = TRUE, suffix = c(".sp11", ".fa12"), keep = FALSE, name = "id")
新增条目追加示例
计划在 full_join() 后过滤已横向关联的条目,将剩余条目通过 bind_rows() 追加到数据集底部,操作代码如下:
programmatic_database <- fa12[!which(fa12$id %in% programmatic_database),] %>% dplyr::bind_rows(programmatic_database, fa12)
可复现示例代码
#可复现示例 fa11 <- structure(list(id = c("1001", "1002", "1003", "1013"), act6_05_composite = c(33L, 26L, 27L, 25L), course_code = c("101", "101", "101", "101"), term_code = c("FA11", "FA11", "FA11", "FA11" ), section_code = c(1L, 1L, 1L, 1L), grade = c(4, 0, 0, 2.5 ), repeat_status_flag = c(NA, "PR", NA, NA), class_code = c(1L, 1L, 1L, 1L), cum_atmpt_credits_prior = c(16, 0, 0, 0), cum_completed_credits_prior = c(0L, 0L, 0L, 0L), cum_passed_credits_prior = c(16, 0, 0, 0), cum_gpa_prior = c(0, 0, 0, 0), cum_atmpt_credits_during = c(29, 15, 18, 15), cum_completed_credits_during = c(13L, 1L, 10L, 15L), cum_passed_credits_during = c(29, 1, 14, 15), term_gpa = c(3.9615, 0.2333, 2.3214, 2.9666), row.names = c(NA, 4L ), class = "data.frame") sp12 <- structure(list(id = c("1007", "1013", "1355", "2779", "2302"), act6_05_composite = c(24L, 26L, 25L, 24L, 24L), course_code = c(101L, 102L, 101L, 101L, 101L ), term_code = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), section_code = c(1L, 1L, 1L, 1L, 1L), grade = c(2, 2.5, 2, 1.5, 3.5), repeat_status_flag = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ ), class_code = c(2L, 2L, 1L, 2L, 2L), cum_atmpt_credits_prior = c(44, 43, 12, 43, 30), cum_completed_credits_prior = c(41L, 43L, 12L, 43L, 12L), cum_passed_credits_prior = c(41, 43, 12, 43, 30), cum_gpa_prior = c(3.3125, 3.186, 3.5416, 3.1785, 3.8636), cum_atmpt_credits_during = c(56, 59, 25, 64, 43), cum_completed_credits_during = c(53L, 56L, 25L, 56L, 25L), cum_passed_credits_during = c(53, 59, 25, 64, 43), term_gpa = c(2.8333, 3.423, 3.1153, 2.1923, 3.6153), row.names = c(NA, 5L), class = "data.frame") # 以2011年秋季学期数据框创建初始对象 programmatic_database <- fa11 # 按id关联2012年春季学期数据框,选取指定变量并添加对应后缀 programmatic_database <- programmatic_database %>% full_join(select(sp12, id, course_code, section_code, grade, term_gpa), by = "id", copy = TRUE, suffix = c(".fa11", ".sp12"), keep = FALSE, name = "id") # 查看关联结果,根据需要对指定变量强制类型转换(解决前述报错) # 过滤2012年春季数据中已关联的条目,将剩余条目追加到现有数据集底部 programmatic_database <- sp12[!which(sp12$id %in% programmatic_database),] %>% dplyr::bind_rows(programmatic_database, sp12)
待解决问题
- 实现
full_join()→filter()→bind_rows()的管道操作,不触发列数不匹配、字段类型不一致报错 - 仅为指定的动态数据列添加学期后缀,避免稳定数据列的后缀冗余
- 实现23个数据框的关联绑定自动化,替代手动逐次执行join/bind的繁琐操作
内容的提问来源于stack exchange,提问作者Elizabeth Day
相关产品推荐
相关产品推荐

