使用 read.table() 读取 CSV 文件时出错

Error in reading a CSV file with read.table()

提问人:mockash 提问时间:5/4/2016 最后编辑:zx8754mockash 更新时间:3/28/2023 访问量:41079

问:

我在 R 中加载 CSV 数据集时遇到了问题。数据集可以从

https://data.baltimorecity.gov/City-Government/Baltimore-City-Employee-Salaries-FY2015/nsfe-bg53

我使用如下方式导入数据,并且数据集已正确导入。read.csv

EmpSal <- read.csv('E:/Data/EmpSalaries.csv')

我尝试使用读取数据,但在查看数据集时出现了很多异常。read.table

EmpSal1 <- read.table('E:/Data/EmpSalaries.csv',sep=',',header = T,fill = T)

上面的代码从第 7 行开始读取数据,数据集实际上包含 ~14K 行,但只导入了 5K 行。在少数情况下,当查看数据集时,15-20 行被合并为一行,并且整行数据出现在一列中。

我可以使用以下方法处理数据集,但我很好奇它不适用于 read.table 的原因。read.csv

r

评论

0赞 mockash 5/4/2016
@zx8754您的意思是链接不起作用或下载不起作用?您可以从链接中的“导出”选项卡将数据导出为任何格式
0赞 zx8754 5/4/2016
奇怪,现在它正在工作,对不起。

答:

3赞 lebatsnok 5/4/2016 #1

read.csv 定义为:

function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) 
read.table(file = file, header = header, sep = sep, quote = quote, 
    dec = dec, fill = fill, comment.char = comment.char, ...)

您需要添加(默认情况下需要单引号,而需要双引号)quote="\""read.tableread.csv

EmpSal <- read.csv('Baltimore_City_Employee_Salaries_FY2015.csv')
EmpSal1 <- read.table('Baltimore_City_Employee_Salaries_FY2015.csv', sep=',', header = TRUE, fill = TRUE, quote="\"")
identical(EmpSal, EmpSal1)
# TRUE

评论

0赞 mockash 5/4/2016
我尝试了 TRUE,但仍然结果相同。我只导入了 5083 行。
0赞 lebatsnok 5/4/2016
起初我没有注意到它,但 read.table 的默认值是 ,而 read.csv 的默认值是 .也就是说,出于某种原因,read.table 假定使用单引号,但 read.csv 假定使用双引号。有趣。quote = "\"'"quote = "\"""
0赞 mockash 5/4/2016
谢谢@lebatsnok。这奏效了。但我仍然不明白不提报价选项的主要逻辑。
0赞 lebatsnok 5/4/2016
在许多情况下,这不会有什么不同,但在你的表格中,你有很多带引号的值,例如。.对于(使用默认参数)这将是两个不同的值:而(使用默认参数)会将其识别为单个值。然后你有 和 - 将这些单引号之间的所有内容作为单引号值,即 ."Abrams,Maxine"read.tablequote"AbramsMaxine"read.csvquoteASSISTANT STATE'S ATTORNEYSheriff's Officeread.table'S ATTORNEY ... ..... ..... Sheriff'
0赞 mockash 5/4/2016
谢谢你的解释。
2赞 itsyub 5/4/2016 #2

如前所述,使用命令成功导入数据,而不提及引号参数。 read.csv 函数的引用参数的默认值为 ,read.table 函数的 quote 参数的默认值为 。 检查以下代码,read.csv()"\"""\"'"

read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)

您指定的数据中有许多单报价。这就是read.table函数不适合您的原因。

试试下面的代码,它将为你工作。

 r<-read.table('/home/workspace/Downloads/Baltimore_City_Employee_Salaries_FY2015.csv',sep=",",quote="\"",header=T,fill=T)

评论

0赞 mockash 5/4/2016
代码工作正常。但是在 quote 的语法中被提及为 .但是在代码中,我们给出了.这是如何工作的?read.tablequote = "\" ' " quote = "\ " "
0赞 itsyub 5/4/2016
您没有在 read.table 函数中指定 quote 参数。正因为如此,函数采用了它的默认值,当你指定时,read.table将单引号字符串视为一个单元格。当您指定 时,read.table 函数会转义单引号,并且仅将双引号字符串视为一个单元格。"\"'"quote="\"'"quote = "\""