R语言DataFrame自定义因子列:不用sapply结果异常求助
问题排查与解决
核心原因:你的grad_fact函数未做向量化处理
你写的grad_fact应该是针对单个数值设计的,没考虑输入是向量的情况。当直接把creditcard$income(一整列向量)传进去时,函数里的if判断只会执行一次——因为R里用if判断向量时,只会取逻辑结果的第一个元素或者判断整个向量是否全满足条件,一旦不满足第一个分支,就直接跳到else返回"average",导致所有结果都一致。
而sapply是循环遍历向量里的每个元素,挨个调用函数,所以能得到正确的分级结果。
验证与修复步骤
1. 先确认函数的问题
假设你的函数是这种非向量化写法:
grad_fact <- function(income) { if(income < 50000) { return("low") } else if(income >= 50000 & income < 100000) { return("average") } else { return("high") } }
当传入c(30000, 70000, 120000)这种向量时,income < 50000会返回c(TRUE, FALSE, FALSE),if只会认这个逻辑向量的第一个值(或者判断是否全为真),最终直接返回"average"。
2. 三种修复方法任选
- 方法一:用
ifelse嵌套实现向量化
grad_fact <- function(income) { ifelse(income < 50000, "low", ifelse(income >= 50000 & income < 100000, "average", "high")) }
- 方法二:用
dplyr的case_when,逻辑更清晰
library(dplyr) grad_fact <- function(income) { case_when( income < 50000 ~ "low", income >= 50000 & income < 100000 ~ "average", TRUE ~ "high" ) }
- 方法三:直接用
Vectorize包装原函数,不用改逻辑
grad_fact_vec <- Vectorize(grad_fact)
修复后直接调用creditcard$income_level <- grad_fact(creditcard$income)(或grad_fact_vec)就能得到正确结果。
3. 生成有序因子的正确写法
如果要生成有序因子,修复后可以这么写:
creditcard$income_level <- factor(grad_fact(creditcard$income), levels = c("low", "average", "high"), ordered = TRUE)
内容的提问来源于stack exchange,提问作者Kit_ri
相关产品推荐
相关产品推荐

