R语言data.frame字符转数值异常求助:FIPS编码转换出错
这个问题的核心差异,根源在于data.frame和tibble对混合类型向量的默认处理逻辑不一样,尤其是旧版R里data.frame的自动转因子行为在搞鬼!
先拆解data.frame的异常情况
当你运行data.frame(fips = c(1,"01"))时:
- 首先,因为向量里同时有数值(
1)和字符串("01"),R会先把整个向量统一转成字符类型,得到c("1", "01")。 - 在旧版R(4.0之前)中,
data.frame的默认参数stringsAsFactors = TRUE——这会把字符向量自动转换成因子(factor)。因子的levels是按字典序排序的,也就是c("01", "1"),对应的内部编码是:"01"对应1,"1"对应2。 - 当你用
as.numeric(fips)转换时,实际上提取的是因子的内部编码,而不是字符串对应的数值。所以原来的1(转成字符后是"1")对应编码2,"01"对应编码1,就出现了你看到的2和1的诡异结果。
再看tibble的正常逻辑
tibble从设计之初就默认关闭了自动转因子的行为(stringsAsFactors = FALSE是默认值):
- 所以
c(1,"01")会被直接保留为字符向量c("1", "01"),不会转成因子。 - 当你用
as.numeric(fips)转换时,是直接把每个字符串解析成数值:"1"变成1,"01"也会被R自动识别为数值1,结果就是两个1,符合你的预期。
解决方法
如果想让data.frame也得到正确结果,有两个办法:
- 创建data.frame时显式设置
stringsAsFactors = FALSE:test <- data.frame(fips = c(1,"01"), stringsAsFactors = FALSE) %>% mutate(fips = as.numeric(fips)) - 升级到R 4.0及以上版本——新版R已经把
stringsAsFactors的默认值改成了FALSE,不会再自动把字符转成因子。
内容的提问来源于stack exchange,提问作者Jo_
相关产品推荐
相关产品推荐

