R语言中如何更新DataFrame?自定义函数未正确生成决策列
问题分析与解决
你的代码无法正确生成decision列并返回更新后的数据框,核心问题有三个:
return(df)位置错误:把返回语句放在了for循环内部,导致循环只执行一次(处理第一行)就直接返回原数据框,后续行完全没有处理。decision列赋值逻辑错误:初始化df$decision <- c()后,你在循环中创建了局部变量decision并赋值,但这个变量和数据框中的df$decision没有关联,修改局部变量不会影响数据框的列。- 条件判断冗余:第二个和第三个
else if条件可以合并,因为只要income < 40000,无论c_record是TRUE还是FALSE,结果都是"Admit"。
修正后的循环版本代码
all_loan_offers <- function(df) { # 初始化decision列,默认值为"Reject",长度与数据框行数一致 df$decision <- rep("Reject", nrow(df)) for(i in 1:nrow(df)) { income <- df$income[i] c_record <- df$c_record[i] years <- df$years[i] if (income > 80000) { df$decision[i] <- "Admit" } else if(income < 40000) { # 合并冗余条件,简化逻辑 df$decision[i] <- "Admit" } else if(income >= 40000 && income <= 80000 && years > 3) { df$decision[i] <- "Admit" } # 无需else分支,因为已默认赋值为"Reject" } # 循环全部执行完毕后再返回数据框 return(df) } applicants_info <- data.frame(income = c(40000, 80000, 25000, 70000), c_record = c(F, T, T, F), years = c(2, 10, 3, 6), stringsAsFactors = F) all_loan_offers(applicants_info)
运行后会得到正确结果:
income c_record years decision 1 40000 FALSE 2 Reject 2 80000 TRUE 10 Reject 3 25000 TRUE 3 Admit 4 70000 FALSE 6 Admit
更符合R风格的向量化版本
R的核心优势是向量运算,循环处理数据框效率较低,推荐用向量化逻辑实现:
all_loan_offers_vectorized <- function(df) { # 构建所有Admit的条件向量 admit_condition <- (df$income > 80000) | (df$income < 40000) | (df$income >= 40000 & df$income <= 80000 & df$years > 3) # 根据条件赋值,满足条件为"Admit",否则为"Reject" df$decision <- ifelse(admit_condition, "Admit", "Reject") return(df) } all_loan_offers_vectorized(applicants_info)
这个版本代码更简洁,运行效率更高,结果和循环版本一致。
内容的提问来源于stack exchange,提问作者MohnJulheren
相关产品推荐
相关产品推荐

