使用R语言read.csv函数导入CSV文件时遭遇scan()类型匹配错误的技术求助
看起来你遇到的问题是R在解析CSV文件时,把本该是数值型的字段当成了一串包含逗号的字符串,导致类型不匹配报错。虽然你已经用了read.csv,但结合错误信息里的内容,我猜问题出在分隔符/小数分隔符设置或者文件本身的格式变化上——哪怕你用了之前没问题的脚本,数据文件的微小改动都可能引发这类问题。
先看你的错误信息:
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : scan() expected 'a real', got '63991,21.1074,Ischnura,elegans,06/20 /21,HojeA14,1074,0,mature,1,1073,blue,,0,androchrome,,,,,,,,,,,2021,KP'
这串内容明显是一整行的多个字段,但你的脚本指定了sep=";",说明R没正确识别分隔符,把整行(或者一大部分)当成了要解析成numeric的字段,自然会报错。
下面是几个可以尝试的解决方案:
1. 确认CSV文件的实际分隔符
虽然你之前用sep=";"没问题,但可能这次的Exp3.csv文件分隔符变成了逗号?可以用文本编辑器打开文件,看一下每行的字段是用分号还是逗号分隔的。如果是逗号,把脚本里的sep=";"去掉(read.csv默认分隔符就是逗号):
Idata <- read.csv("Exp3.csv", header = T, colClasses=c("numeric", rep("character",4), rep("factor",8), "numeric", "factor", rep("numeric",11), "factor"))
2. 处理小数分隔符的差异
如果你的文件是欧洲格式(用逗号做小数分隔符,比如21,1074而不是21.1074),那需要同时设置dec=","参数,让R正确识别数值:
Idata <- read.csv("Exp3.csv", sep = ";", header = T, dec = ",", colClasses=c("numeric", rep("character",4), rep("factor",8), "numeric", "factor", rep("numeric",11), "factor"))
3. 排查文件中的异常行
错误信息里的字符串有很多连续逗号(空值),可能某一行的格式错乱了——比如某个字段意外包含了分隔符,却没加引号包裹。可以先用readLines读取几行看看结构:
head(readLines("Exp3.csv"), n=5)
这样能直观找到格式异常的行,手动修正或者用skip参数跳过该行,也可以用na.strings=c("")统一处理空值。
4. 尝试更智能的解析工具
如果上面的方法都不行,可以试试readr包的read_csv函数,它的解析逻辑更灵活,还会给出精准的错误定位:
library(readr) Idata <- read_csv("Exp3.csv", col_types = cols( col_double(), col_character(), col_character(), col_character(), col_character(), col_factor(), col_factor(), col_factor(), col_factor(), col_factor(), col_factor(), col_factor(), col_factor(), col_double(), col_factor(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_double(), col_factor() ))
如果有解析错误,它会明确告诉你是哪一行哪一列出了问题,方便快速定位修复。
内容的提问来源于stack exchange,提问作者Erik Svensson

