读取R中的数据集时出错
在R中读取我的数据时,如下所示:
Dataset.df <- read.table("C:\\dataset.txt", header=T)
我收到以下错误信息:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : line 1 did not have 145 elements
这是什么意思,有人可以告诉我如何解决?
这个错误是不言自明的。 在数据文件的第一行(或者第二行,因为使用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行find3个元素,所以你得到一个错误:
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丢失,也能够知道它需要多less元素:
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
当遇到这个错误,并查看我的数据集似乎没有丢失的数据,我发现我的一些条目有特殊字符“#”,导致导入数据。 一旦我从违规的单元格中删除“#”,导入的数据没有问题。
我在将“添加运行状况”数据中的某些文件导入到R时遇到此问题(请参阅: http : //www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600 )例如,以下命令以tab分隔的.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拒绝该文件的某些文件,似乎存在轻微的格式问题。 至less部分问题似乎是偶尔使用双引号而不是一个撇号,导致一行中双引号字符数量不平衡。
摆弄之后,我已经确定了三种可能的解决scheme:
-
在文本编辑器中打开文件,然后search/replace引用字符的所有实例,换句话说,删除所有的双引号。对于这个制表符分隔的数据,这意味着只有一些逐句摘录的主题评论引用时间较长,这对我的数据分析来说是一个非问题。
-
利用ICPSR(见上面的链接)或其他档案存储的数据,另一种解决scheme是以新的格式下载数据。 在这种情况下,一个好的select是下载St12版本的DS12,然后使用read.dta命令打开它,如下所示:
library(foreign) ds12 <- read.dta("21600-0012-Data.dta")
-
一个相关的解决scheme/破解是在Excel中打开.tsv文件并将其重新保存为一个制表符分隔的文本文件。 这似乎清理了任何格式问题使R不高兴。
这些都不是理想的,因为它们不能很好的解决R原来的.tsv文件中的问题,但是数据争夺通常需要使用多种程序和格式。
对于其他人无法find解决scheme,并知道数据不缺的元素:
当我使用Excel 2013将文件保存为.csv,然后尝试使用read.table()将其加载到R中时,出现此问题。 我find的解决方法是将数据直接从Excel粘贴到.txt文档中,然后打开:
read.table(file.choose(), sep="\t").
我希望这有帮助。
如果您使用的是Linux,并且数据文件来自Windows。 这可能是因为字符^ Mfind并删除。 完成了!
我遇到了这个错误,当我有一个名为“ID”的列row.names =“ID”(每个教程 )。
我的一个variables是一个替代是多string(“无事件”)的分类。 当我使用read.table时,它假设第一个string之后的空格表示数据点的结束,第二个string被推送到下一个variables。 我用sep =“\ t”来解决这个问题。 我在Mac OX环境中使用RStudio。 以前的解决scheme是将.txt文件转换为Excel中的.csv,然后用read.csv函数打开它们。