R语言tidymodels数据预处理中drat值异常变更问题咨询
tidymodels字符转数值异常的原因与解决办法
问题根源
你遇到的不是bug,是tidymodels的recipe组件的默认行为:当你创建recipe时,字符型的预测变量会被自动推断为分类变量(转为因子),哪怕你手动设置了角色。这时候直接用as.numeric()处理,得到的是因子水平的整数索引(比如"3.9"是drat因子的第16个水平,所以转成16),而不是字符串对应的数值。
而function(x) as.numeric(as.character(x))能正常工作,是因为它先把自动生成的因子转回字符串,再转换为数值,绕开了因子索引的问题。
两种正确的解决方式
方式1:禁用自动转因子
在创建recipe时添加strings_as_factors = FALSE参数,让字符变量保持原类型,直接用as.numeric就能正确转换:
library(tidymodels) mt <- mtcars[,c('mpg', 'hp', 'drat', 'am')] mt$hp <- as.character(mt$hp) mt$drat <- as.character(mt$drat) dp_pipe1 <- recipe(mpg ~ hp + drat + am, data = mt, strings_as_factors = FALSE) %>% update_role(c(hp, drat), new_role = "to_numeric") %>% step_mutate_at(has_role('to_numeric'), fn = as.numeric) dp_pipe2 <- prep(dp_pipe1) bake(dp_pipe2, NULL)
方式2:使用鲁棒的数值解析函数
用readr::parse_number()替代as.numeric,它会自动处理因子转字符串的过程,还能兼容带非数字字符的字符串(如果有的话):
dp_pipe1 <- recipe(mpg ~ hp + drat + am, data = mt) %>% update_role(c(hp, drat), new_role = "to_numeric") %>% step_mutate_at(has_role('to_numeric'), fn = readr::parse_number) dp_pipe2 <- prep(dp_pipe1) bake(dp_pipe2, NULL)
总结
这是recipe默认的变量类型推断逻辑导致的,不是bug。通过上述两种方法,都能稳定完成字符到数值的转换。
内容的提问来源于stack exchange,提问作者PKumar
相关产品推荐
相关产品推荐

