导入数据集时出现问题:`扫描错误(...):第 1 行没有 145 个元素`

Posted

技术标签:

【中文标题】导入数据集时出现问题:`扫描错误(...):第 1 行没有 145 个元素`【英文标题】:Issue when importing dataset: `Error in scan(...): line 1 did not have 145 elements` 【发布时间】:2013-08-12 05:32:34 【问题描述】:

我正在尝试使用 read.table() 在 R 中导入我的数据集:

Dataset.df <- read.table("C:\\dataset.txt", header=TRUE)

但我收到以下错误消息:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
   line 1 did not have 145 elements

这是什么意思,我该如何解决?

【问题讨论】:

【参考方案1】:

这个错误是不言自明的。您的数据文件的第一行(或第二行,可能是因为您使用的是header = TRUE)中似乎缺少数据。

这是一个小例子:

## Create a small dataset to play with
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt")

R 自动检测到它应该期望行名加上两列(3 个元素),但它在第 2 行没有找到 3 个元素,所以你得到一个错误:

read.table("test.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 2 did not have 3 elements

查看数据文件,看看是否确实有问题:

cat(readLines("test.txt"), sep = "\n")
# V1 V2
# First 1 2
# Second 2
# Third 3 8

可能需要手动更正,或者我们可以假设“第二”行中的第一个值应该在第一列,其他值应该是NA。如果是这种情况,fill = TRUE 足以解决您的问题。

read.table("test.txt", header = TRUE, fill = TRUE)
#        V1 V2
# First   1  2
# Second  2 NA
# Third   3  8

即使缺少行名,R 也足够聪明,可以计算出它需要多少元素:

cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt")
cat(readLines("test2.txt"), sep = "\n")
# V1 V2
# 1
# 2 5
# 3 8
read.table("test2.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 1 did not have 2 elements
read.table("test2.txt", header = TRUE, fill = TRUE)
#   V1 V2
# 1  1 NA
# 2  2  5
# 3  3  8

【讨论】:

我打赌 100 次中有 99 次是谷歌搜索的人,这不会是实际的缺失数据。与此问题的其他答案一样,它们会出现错误的分隔符或特殊字符问题。 我认为fill = TRUE应该是默认的 同意。 fill = TRUE 是我的解决方案。【参考方案2】:

当遇到此错误并查看似乎没有丢失数据的数据集时,我发现我的一些条目具有特殊字符“#”,导致数据导入脱轨。一旦我从有问题的单元格中删除了“#”,导入的数据就没有问题了。

【讨论】:

你也可以设置read.table(..., comment.char = "")来关闭文件中对cmets的解释。 撇号也可能导致它(')。通过设置选项 quote = "\"" 来解决这个问题【参考方案3】:

我在将 Add Health 数据中的一些文件导入 R 时遇到了这个问题(请参阅:http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600)例如,以下读取制表符分隔的 .tsv 格式的 DS12 数据文件的命令将生成以下错误:

ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="", 
quote = "\"", header=TRUE)

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, 
na.strings,  : line 2390 did not have 1851 elements

某些文件似乎存在轻微的格式问题,导致 R 拒绝该文件。至少部分问题似乎是偶尔使用双引号而不是撇号导致一行中的双引号字符数量不均匀。

经过一番折腾,我确定了三种可能的解决方案:

    在文本编辑器中打开文件并搜索/替换引号字符的所有实例。换句话说,删除所有双引号。对于此制表符分隔的数据,这仅意味着一些逐字摘录来自受试者的 cmets 不再用引号引起来,这对我的数据分析来说不是问题。

    如果数据存储在 ICPSR(参见上面的链接)或其他存档中,另一种解决方案是以新格式下载数据。在这种情况下,一个不错的选择是下载 DS12 的 Stata 版本,然后使用 read.dta 命令打开它,如下所示:

    library(foreign)
    ds12 <- read.dta("21600-0012-Data.dta")
    

    相关的解决方案/hack 是在 Excel 中打开 .tsv 文件并将其重新保存为制表符分隔的文本文件。这似乎可以清除任何让 R 不满意的格式问题。

这些都不是理想的,因为它们不能完全解决 R 中使用原始 .tsv 文件的问题,但数据整理通常需要使用多种程序和格式。

【讨论】:

【参考方案4】:

如果您使用的是 linux,并且数据文件来自 windows。 这可能是因为字符 ^M 找到并删除。 完成!

【讨论】:

【参考方案5】:

对于无法找到解决方案并且知道数据没有丢失元素的其他人:

当我使用 Excel 2013 将文件另存为 .csv,然后尝试使用 read.table() 将它们加载到 R 中时,我遇到了这个问题。我发现的解决方法是将 Excel 中的数据直接粘贴到 .txt 文档中,然后打开:

read.table(file.choose(), sep="\t").

我希望这会有所帮助。

【讨论】:

【参考方案6】:

我的变量之一是分类变量,另一种变量是多字符串(“无事件”)。当我使用 read.table 时,它​​假定第一个字符串后面的空格表示数据点的结尾,第二个字符串被推送到下一个变量。我使用 sep="\t" 来解决问题。我在 Mac OX 环境中使用 RStudio。 以前的解决方案是在 Excel 中将 .txt 文件转换为 .csv,然后使用 read.csv 函数打开它们。

【讨论】:

投了反对票。扩展与 R 无关。您可以使用 read.csv() 无论文件被称为 something.txt、something.xls 还是 something.csv,只要文件是 ASCII。另请注意 read.csv() 与 read.table(sep=',', header=TRUE) 相同。它只是后者的简写。【参考方案7】:

哈希# 符号创建此错误,如果您可以从列名的开头删除#,它可以解决问题。

基本上,当列名在行之间以# 开头时,read.table() 将识别为该行的起点。

【讨论】:

【参考方案8】:

当我有一个名为“id”的列的 row.names="id"(根据 tutorial)时遇到此错误。

【讨论】:

【参考方案9】:

除了上面提到的所有指导,您还可以查看所有数据。

如果单词之间有空格,必须用"_"替换。

但是我如何解决我自己的问题。

【讨论】:

【参考方案10】:

这个简单的方法为我解决了这个问题: 复制数据集的内容,打开一个空的 Excel 工作表,选择“选择性粘贴”->“值”,然后保存。而是导入新文件。

(我尝试了所有现有的解决方案,但没有一个对我有用。我的旧数据集似乎没有缺失值、空格、特殊字符或嵌入的公式。)

【讨论】:

【参考方案11】:

我在尝试从 R 中的文件读取数据时遇到了同样的问题。在弄清楚后我发现 sep 值导致了这个问题。一旦我尝试使用正确的分隔符,它就会按预期工作。

read.table("file_location/file_name",
    sep="." # exact separator as given in file: also "," or "\t" etc.
    col_names=c("name_1", "name_2",..))

【讨论】:

【参考方案12】:

read.table() 中传递参数 comment.char = "" 在某些情况下会有所帮助。如果没有,我就求助于:read_delim(file = "filename.tsv", delim = '\t') 这对我有用。

这里是函数的文档:http://rfunction.com/archives/1441 `

【讨论】:

以上是关于导入数据集时出现问题:`扫描错误(...):第 1 行没有 145 个元素`的主要内容,如果未能解决你的问题,请参考以下文章

编织 RMarkdown 文档时出现 YAML 错误 - 扫描仪错误

执行谷歌数据流作业时出现 HTTP 传输错误

将数据集导入 Docker 下的 Clickhouse 时出现“异常:没有要插入的数据”

导入 CSV 文件时出现问题 (phpmyadmin)

处理大型数据集时出现内存不足错误

将 libgdx 项目导入 Eclipse 时出现 Gradle 错误