R语言中ifelse函数为何仅返回数字?附示例代码
嘿,这个问题我之前踩过坑,大概率是因子类型在暗中搞鬼,咱们一步步理清楚:
为什么ifelse会返回数字?
你先执行了house$room_type <- c('2室1厅','2室2厅','3室2厅','1室1厅','4室2厅', '3室1厅','1室','2室','1室2厅','5室2厅','4室3厅'),但如果house是个data.frame,而且这个room_type列原本是因子(factor)类型,R会自动把你赋值的字符向量转成因子(旧版R默认stringsAsFactors=TRUE,哪怕你没手动设置)。
而因子在R内部其实是用数字编码存储的——每个字符串对应一个数字(比如第一个出现的水平是1,第二个是2,以此类推)。当你用ifelse处理这个因子列时,R会默认把因子转换成它内部的数字编码,而不是你看到的字符串,所以最终返回的就是数字类型了。
举个简单的例子验证这个场景:
# 模拟你的情况:先创建带因子列的data.frame house <- data.frame(room_type = factor(c('1室1厅'))) # 赋值字符向量,但room_type还是因子 house$room_type <- c('2室1厅','2室2厅','3室2厅') # 查看类型:确实是因子 class(house$room_type) # 用ifelse测试,返回的是因子对应的数字索引 ifelse(house$room_type == '2室1厅', house$room_type, 0)
还有一种小概率情况:如果你的ifelse语句两个分支返回的是不同类型(比如一个是数字,一个是字符),R会自动做类型转换,把字符转成数字(此时字符会变成NA)。比如你写了ifelse(house$room_type == '1室', 1, '一居室'),结果会是1 NA NA ...(数字型),这时候得确保两个分支类型一致。
解决办法
有两种简单的处理方式:
- 先把因子转成字符型,再执行
ifelse:
house$room_type <- as.character(house$room_type) # 现在再用ifelse,就能得到你预期的类型了 result <- ifelse(house$room_type == '2室1厅', '两室一厅', '其他户型')
- 赋值时强制保留字符类型,避免自动转成因子:
如果是新建列或者覆盖原有列,可以用I()函数锁定字符类型:
house$room_type <- I(c('2室1厅','2室2厅','3室2厅','1室1厅',...)) # 用dplyr的话更直观: library(dplyr) house <- house %>% mutate(room_type = as.character(room_type))
总结一下,最常见的原因就是因子被隐式转换成了内部的数字编码,解决的核心就是先把列转成字符型再处理~
内容的提问来源于stack exchange,提问作者Kyan
相关产品推荐
相关产品推荐

