R使用readr读取txt文件提示parsers与列名不匹配该如何处理?
警告触发原因
- 核心原因是你在
col_types = cols()中传入的命名参数对应列名hotels、names,和读取文件时识别到的实际表头列名不一致,readr找不到对应名称的列,因此抛出匹配失败的警告。 - 额外常见诱因:你使用了专用于逗号分隔文件的
read_csv()读取txt格式文件,如果你的txt文件是制表符、空格等其他分隔方式,会导致读取出的列识别错误,自然无法匹配你指定的列名。 - 特殊场景:如果你的txt文件本身没有表头、第一行就是数据,你没有主动通过
col_names参数自定义列名,直接在col_types中写自定义列名也会触发该警告。
解决方案
步骤1:确认文件实际结构
先运行以下代码查看文件的分隔方式、是否有表头、实际列名:
library(readr) # 查看文件前5行内容,确认分隔符和是否有表头 read_lines("C:/Users/illn/Docs/LMU/Programming/hotels.txt", n_max = 5) # 自动识别读取文件,查看实际列名 hotels_test <- read_delim("C:/Users/illn/Docs/LMU/Programming/hotels.txt", show_col_types = FALSE) print(colnames(hotels_test))
步骤2:对应修改读取代码
场景A:文件本身有表头,只是你col_types里的列名写错了
把cols()里的参数替换成上一步查到的实际列名即可,示例:
hotels <- read_delim("C:/Users/illn/Docs/LMU/Programming/hotels.txt", col_types = cols( # 替换为你实际查到的列名 实际列名1 = col_character(), 实际列名2 = col_character() ) )
场景B:文件没有表头,你想自定义列名为hotels、names
主动加col_names参数指定自定义列名即可:
hotels <- read_delim("C:/Users/illn/Docs/LMU/Programming/hotels.txt", # 自定义列名 col_names = c("hotels", "names"), # 如果第一行是表头要跳过就设为1,是数据就设为0 skip = 0, col_types = cols(hotels = col_character(), names = col_character()) )
场景C:不想按列名指定,只想按列顺序指定类型
直接传入和列顺序对应的格式简写即可,比如前两列为字符型,后续列自动识别:
hotels <- read_delim("C:/Users/illn/Docs/LMU/Programming/hotels.txt", col_types = "cc" )
内容的提问来源于stack exchange,提问作者ilraz98
相关产品推荐
相关产品推荐

