多数据集嵌套循环数据清洗配置问题求助(附R代码)
问题与修正方案
核心需求
整合2018-2022年秋季(FA)、春季(SP)、夏季(SU)学期数据集,需排除:
- 2018年春季(SP)、夏季(SU)数据
- 2022年夏季(SU)无可用数据,需跳过
原代码的关键问题
- 变量大小写不一致:循环变量用
Yr,但后续代码误写为YR,导致AcademicYear生成失败、Dat_索引错误 - 跳过条件匹配错误:
Year向量存储的是短年份("18"而非"2018"),原条件中Yr=="2018"无法匹配,导致2018SP/SU数据未被正确跳过 - 未初始化列表:
Prep_和Dat_未提前定义为空列表,运行时会抛出对象不存在的错误 - 无效代码行:
Dat_[[Sem, YR]]仅索引未赋值,无法将处理后的数据存入Dat_
修正后的代码
# 初始化存储列表 Prep_ <- list() Dat_ <- list() # 定义需要处理的学期和年份 Semester <- c("FA","SP", "SU") Year <- c("18","19","20","21","22") for(Sem in Semester) { for(Yr in Year){ # 修正跳过条件:匹配短年份,排除指定学期 if((Sem == "SU" & Yr == "22") | (Sem == "SP" & Yr == "18") | (Sem == "SU" & Yr == "18")) { next } # 数据合并与清洗逻辑 Prep_[[paste(Sem, Yr, sep = "_")]] <- bind_rows(ASPH_Grad_[[paste(Sem, Yr, sep = "_")]], ID_Grad_[[paste(Sem, Yr, sep = "_")]]) %>% left_join(PhGrad_[[paste(Sem, Yr, sep = "_")]], by = c("ID" = "BannerID")) %>% distinct(ID, Program, .keep_all = TRUE) %>% mutate(New_Deg = case_when( !is.na(PHGRAD.Degree) ~ PHGRAD.Degree, is.na(PHGRAD.Degree) ~ Degree, TRUE ~ "Error" )) %>% rowwise() %>% mutate(racecount = sum(c_across(`Race-Am Ind`:`Race- Caucasian`) == "Y", na.rm = TRUE)) %>% ungroup() %>% mutate( racecode = case_when( Citizenship %in% c("NN", "NV") ~ "foreign_national", `Race- Hispanic` == "Y" ~ "hispanic_latino", racecount > 1 ~ "two_or_more_races", `Race-Am Ind` == "Y" ~ "american_indian_alaskan_native", `Race- Asian` == "Y" ~ "asian", `Race-Afr Amer` == "Y" ~ "black_african_american", `Race- Hawaiian` == "Y" ~ "native_hawaiian_pacific_islander", `Race- Caucasian` == "Y" ~ "white", `Race-Not Rept` == "Y" ~ "race_unknown", TRUE ~ "race_unknown" ), gender_long = case_when( Gender == "F" ~ "Female", Gender == "M" ~ "Male", Gender == "N" ~ "Other", TRUE ~ "other" ), DEPT = case_when( Program %in% c("3GPH363AMS", "3GPH363AMSP", "3GPH378AMCD", "3GPH378AMS", "3GPH379APHD") ~ "COMD", Program %in% c("3GPH593AMPH", "3GPH593AMS", "3GPH593APHD", "3GPH569ACGS") ~ "ENHS", Program %in% c("3GPH596AMS", "3GPH596AMSPH", "3GPH596APHD","3GPH594AMPH", "3GPH594AMS", "3GPH594AMSPH", "3GPH594APHD", "3GPH586APBAC") ~ "EPID/BIOS", Program %in% c("3GPH331AMS","3GPH331APHD","3GPH334AMS","3GPH335ADPT", "3GPH377AMS", "3GPH388AMS", "3GPH588AMPH", "3GPHJ331MS", "3UPH331ABS") ~ "EXSC", Program %in% c("3GPH592AMPH", "3GPH592APHD", "3GPH576CGS", "3GPH121CGS", "3GID635CGS") ~ "HPEB", Program %in% c("3GPH591AMPH", "3GPH591APHD", "3GPH597AMHA") ~ "HSPM", TRUE ~ "Missing" ), degree_delivery_type = case_when( `First Concentration` == "R999" | `Second Concentration` == "R999" ~ "Distance-based", `First Concentration` == "3853" | `Second Concentration` == "3853" ~ "Executive", TRUE ~ "Campus-based" ), FTE_compute = case_when( Level == "GR" & `Course Hours` < 9 ~ `Course Hours`/9, Level == "GR" & `Course Hours` >=9 ~ 1, Level == "UG" & `Course Hours` <12 ~ `Course Hours`/12, Level == "UG" & `Course Hours` >=12 ~ 1 ), Full_Part_Status = case_when( (Level == "GR" & `Course Hours` <9) | (Level == "UG" & `Course Hours` <12) ~ "parttime_status", (Level == "GR" & `Course Hours` >=9) | (Level == "UG" & `Course Hours` >=12) ~ "fulltime_status", TRUE ~ "other" ), AcademicYear = paste(Sem, Yr, sep = "_"), StudentCount = 1 ) # 将处理后的数据存入Dat_ Dat_[[paste(Sem, Yr, sep = "_")]] <- Prep_[[paste(Sem, Yr, sep = "_")]] } } # 合并所有处理后的数据集到一个数据框 final_data <- bind_rows(Dat_)
额外优化说明
- 用
paste(Sem, Yr, sep = "_")生成统一的列表索引(如"FA_18"),避免二维索引的潜在问题 - 将
list()替换为c()简化向量定义,代码更简洁 - 修正
is.na(PHGRAD.Degree)==F为!is.na(PHGRAD.Degree),符合R语言编码习惯 - 最后添加
bind_rows(Dat_)直接生成合并后的最终数据集,无需手动拼接
内容的提问来源于stack exchange,提问作者asokol
相关产品推荐
相关产品推荐

