基于DataFrame列的if-else条件生成新列值异常求助
解决R中if-else生成新列显示数字而非文本的问题
这个问题大概率是因子(factor)类型搞的鬼!我来一步步帮你解决:
问题重现
先把你的示例DataFrame补全,方便测试:
testing2 <- data.frame( adminn_cleaned = c("Sean","Sean"), adminn_needs_update = c(TRUE, FALSE), adminn_updated = c("John", "Sean") )
如果直接用基础R的ifelse()赋值:
testing2$adminn_final <- ifelse(testing2$adminn_needs_update, testing2$adminn_updated, testing2$adminn_cleaned)
你会发现adminn_final列全是数字——这是因为默认创建的data.frame会把字符串列转成因子,因子底层是用整数编码存储的,ifelse()直接返回了这些编码值,而不是你看到的文本。
三种解决方案
1. 创建DataFrame时禁用自动转因子(推荐)
在R 4.0及以后版本,默认已经是stringsAsFactors=FALSE,但如果你的版本比较旧,或者需要兼容旧代码,创建数据时加上这个参数:
testing2 <- data.frame( adminn_cleaned = c("Sean","Sean"), adminn_needs_update = c(TRUE, FALSE), adminn_updated = c("John", "Sean"), stringsAsFactors = FALSE # 关键:不让字符串转因子 ) # 再运行赋值代码 testing2$adminn_final <- ifelse(testing2$adminn_needs_update, testing2$adminn_updated, testing2$adminn_cleaned)
2. 把已有的因子列转成字符型
如果你的DataFrame已经存在,先把涉及的列转换成字符类型,再用ifelse():
# 转换列类型 testing2$adminn_cleaned <- as.character(testing2$adminn_cleaned) testing2$adminn_updated <- as.character(testing2$adminn_updated) # 生成新列 testing2$adminn_final <- ifelse(testing2$adminn_needs_update, testing2$adminn_updated, testing2$adminn_cleaned)
3. 使用dplyr的if_else()函数(更严谨)
dplyr的if_else()会严格检查输入类型,避免因子带来的问题,同时代码更整洁:
library(dplyr) testing2 <- testing2 %>% # 先转字符(如果列是因子的话) mutate( adminn_cleaned = as.character(adminn_cleaned), adminn_updated = as.character(adminn_updated), # 生成目标列 adminn_final = if_else(adminn_needs_update, adminn_updated, adminn_cleaned) )
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

