You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多数据集嵌套循环数据清洗配置问题求助(附R代码)

问题与修正方案

核心需求

整合2018-2022年秋季(FA)、春季(SP)、夏季(SU)学期数据集,需排除:

  • 2018年春季(SP)、夏季(SU)数据
  • 2022年夏季(SU)无可用数据,需跳过

原代码的关键问题

  1. 变量大小写不一致:循环变量用Yr,但后续代码误写为YR,导致AcademicYear生成失败、Dat_索引错误
  2. 跳过条件匹配错误:Year向量存储的是短年份("18"而非"2018"),原条件中Yr=="2018"无法匹配,导致2018SP/SU数据未被正确跳过
  3. 未初始化列表:Prep_和Dat_未提前定义为空列表,运行时会抛出对象不存在的错误
  4. 无效代码行: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:02:52