read_csv读取CSV文件时丢失字符串末尾的'f'问题咨询
read_csv读取CSV文件时丢失字符串末尾的'f'问题咨询
嗨,这个问题其实是read_csv()(tidyverse体系里readr包的函数)的自动类型猜测机制导致的,咱们来一步步理清楚:
问题原因拆解
- 当第一列所有值都是
1306f时,read_csv()的自动类型检测会误把它识别为单精度浮点数格式(部分编程语言里会用数字+f表示单精度浮点数),于是将这一列解析为数值类型,末尾的f自然就被丢弃了,只剩下1306。 - 当列内的末尾字母不一致(比如你的第二个例子里是c/d/e/f/g),
read_csv()无法将其匹配为任何数值类型,就会正确解析为字符串,保留完整内容。 - 而基础包的
read.csv()默认会将这类混合数字和字母的列解析为字符型,所以不会出现丢失字符的情况。
解决方案(继续使用tidyverse的read_csv())
有两个简单可靠的办法:
精准指定目标列的类型
读取时通过col_types参数强制把第一列设为字符型,其他列可以按需指定或自动猜测:# 明确指定每一列的类型 temp <- read_csv("Desktop/names_test.csv", col_types = cols( x = col_character(), y = col_integer() )) # 或者只指定目标列,其他列自动猜测 temp <- read_csv("Desktop/names_test.csv", col_types = cols( x = col_character(), .default = col_guess() ))先全量按字符型读取,再按需转换
先把所有列都读成字符型,避免自动类型猜测的干扰,之后再把需要转换的列(比如y列)改成数值型:temp <- read_csv("Desktop/names_test.csv", col_types = cols(.default = col_character())) # 转换y列为整数型 temp$y <- as.integer(temp$y)
这样就能完美保留1306f这类字符串的完整内容啦!
备注:内容来源于stack exchange,提问作者tjr
相关产品推荐
相关产品推荐

