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

时间:2013-08-10 10:30:26

标签: r import read.table

我正在尝试使用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

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

11 个答案:

答案 0 :(得分:67)

此错误非常明显。数据文件的第一行似乎缺少数据(或者第二行,因为您使用的是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会自动检测到它应该指向rownames加上两列(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也足够聪明,即使丢失了rownames,也能找出它需要多少元素:

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

答案 1 :(得分:22)

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

答案 2 :(得分:6)

我在将一些文件从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拒绝该文件的文件似乎存在轻微的格式化问题。至少部分问题似乎是偶尔使用双引号而不是撇号,导致一行中双引号字符的数量不均匀。

在摆弄之后,我发现了三种可能的解决方案:

  1. 在文本编辑器中打开文件,搜索/替换引号字符的所有实例&#34;没有。换句话说,删除所有双引号。对于这个以制表符分隔的数据,这只意味着来自主题的一些评论的逐字摘录不再是引号,这对我的数据分析来说不是问题。

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

    library(foreign)
    ds12 <- read.dta("21600-0012-Data.dta")
    
  3. 相关解决方案/ hack是在Excel中打开.tsv文件并将其重新保存为制表符分隔的文本文件。这似乎可以清理任何格式化问题使R不满意。

  4. 这些都不是理想的,因为他们没有用原始的.tsv文件解决R中的问题,但数据争吵通常需要使用多个程序和格式。

答案 3 :(得分:2)

如果您使用的是linux,那么数据文件来自windows。 这可能是因为人物^ M. 找到并删除。 完成了!

答案 4 :(得分:1)

对于那些无法找到解决方案且知道数据不缺少元素的人:

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

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

我希望这会有所帮助。

答案 5 :(得分:0)

当我有一个row.names =“id”(根据tutorial)并且名为“id”的列时,我遇到了这个错误。

答案 6 :(得分:0)

除了上述所有指导之外,您还可以检查所有数据。

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

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

答案 7 :(得分:0)

使用散列#符号创建此错误,如果您可以从列名的开头删除#,则可以解决此问题。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

在尝试从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",..))

答案 10 :(得分:-1)

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