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

REn*_*ast 54 import r read.table

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

Dataset.df <- read.table("C:\\dataset.txt", header=TRUE)
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误消息:

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

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

A5C*_*2T1 69

这个错误非常明显.数据文件的第一行(或第二行,因为您使用的情况可能是这样header = TRUE),似乎缺少数据.

这是一个小例子:

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

  • 我敢打赌,对于那些用谷歌搜索的人来说,100 次中有 99 次,这不会是真正的缺失数据。他们会遇到错误的分隔符或特殊字符问题,就像这个问题的其他答案一样。 (6认同)
  • 我认为 `fill = TRUE` 应该是默认值 (2认同)

小智 25

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

  • 你也可以设置`read.table(...,comment.char ="")`来关闭文件中注释的解释. (16认同)
  • Apostrophies也可能导致它(').通过设置选项quote ="\"修复此问题 (13认同)

Oma*_*sow 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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