不允许重复的“ row.names”错误


69

我正在尝试加载具有14列的csv文件,如下所示:

StartDate, var1, var2, var3, ..., var14

当我发出此命令时:

systems <- read.table("http://getfile.pl?test.csv", header = TRUE, sep = ",")

我收到一条错误消息。

不允许重复的row.name

在我看来,第一列名称是造成此问题的原因。当我手动下载文件并StartDate从文件中删除名称时,R成功读取该文件并将第一列名称替换为X。有人可以告诉我怎么回事吗?该文件是(逗号分隔)的csv文件。


1
该链接(getfile.pl?test.csv)似乎不起作用。您可以复制文件的前几行并将其粘贴到问题中,还是提供一个有效的链接?
nograpes 2012年

那只是一个例子。链接是内部的,您将无法访问它。文件格式如下:date,var1,var2,var3,var4,var5,然后填充一些数据。我可以打开文件,它很准确
George Willy 2012年

系统< -read.table(“ getfile.pl?test.csv”,header = FALSE,sep =“,”),我似乎得到了文件,但知道我必须处理另一行。如果我打印系统的内容。它是这样的:V1 V2 V3 V4 V5 StartDate,服务器,正常运行时间,负载,内存
George Willy 2012年

这个问题不再与(1)它的标题或(2)下面的答案有关。@minitech只是请您最后一次编辑的作者,在问题发布后仅四个小时就完成了……也许您知道如何挽救这个吸引了2万次浏览量的问题。
2015年

1
@弗兰克:哎呀,谢谢!回滚。
Ry-

Answers:


104

然后告诉read.table不要使用row.names

systems <- read.table("http://getfile.pl?test.csv", 
                      header=TRUE, sep=",", row.names=NULL)

现在您的行将简单地编号。

还要看read.csv看哪一个包装器read.table已经为其设置了sep=','header=TRUE参数,以便您的调用简化为

systems <- read.csv("http://getfile.pl?test.csv", row.names=NULL)

您的意思是在最终代码块中使用read.csv而不是read.table吗?
泰勒·林克

21
我以前尝试过,但是没有用。第一列现在称为“ row.names”,列名进一步移动了一个单元格
乔治·威利,2012年

@Tyler:是的,现在修复。谢谢!
德克·埃德比布特

3
“现在不会对行进行编号了”。正如您的注释所表明的那样,列名称也被弄乱了。如果您知道解决方案不需要注释中提到的笨拙的解决方法(移动列名,复制数据),那将是很好的。(不幸的是,“修复您的源数据”不足以解决我的情况-它没有OP的问题,遵循记录的行为stackoverflow.com/a/15285380/1191259。也许我会将我的情况变成可复制的示例
弗兰克(Frank

4
OP已经知道如何避免该错误。实际上,您的回答不如他之前做的那样,因为它会生成一个额外的列,要求复制数据。(我写错了它只会弄乱列名。)
弗兰克(Frank

40

此相关问题指出了?read.table说明您的问题的文档的一部分:

如果有标题,并且第一行包含的字段少于列数,则输入中的第一列用作行名。否则,如果缺少row.names,则会对行进行编号。

标题行的列可能比文件的其余部分少1列,因此read.table假定第一列是row.names(必须全部唯一),而不是列(可以包含重复值)。您可以使用以下两个解决方案之一来解决此问题:

  1. 添加定界符(即\t,在源文件中标题行的开头或结尾),或者
  2. 删除数据中的任何结尾定界符

选择将取决于数据的结构。

示例:
在这里,标题行被解释为比数据少一列,因为分隔符不匹配:

v1,v2,v3   # 3 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

这是默认情况下的解释方式:

   v1,v2,v3   # 3 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

第一列(无标题)的值解释为row.names:a1b1。如果此列包含重复项(完全有可能),那么您将获得duplicate 'row.names' are not allowed错误消息。

如果设置row.names = FALSE,则不会发生移位,但是由于分隔符不匹配,因此标题和数据中的项目数量仍然不匹配。

解决方案1 在标头中添加尾随定界符:

v1,v2,v3,  # 4 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

解决方案2 从非标头行中删除多余的尾部定界符:

v1,v2,v3   # 3 items
a1,a2,a3   # 3 items!!
b1,b2,b3   # 3 items!!

2

打开CSV文件时出现此错误,并且其中一个字段嵌入了逗号。该字段周围有引号,我剪切并粘贴了带有quote =“”的read.table。一旦取出quote =“”,read.table的默认行为就会接管并解决该问题。所以我从这里出发:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",", quote="")

对此:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",")

2

在我的情况下,每行末尾都有一个逗号。通过删除工作


1

此错误的另一个可能原因是您重复了整行。在这种情况下,可以通过删除重复的行来解决问题。


1

我用过read_csvreadr 包装

以我的经验,如果缺少列名row.names=NULL,则read.csv函数中的参数将导致文件的错误读取,即,每列都会移位。

read_csv 解决了这个问题。


0

答案在这里(https://stackoverflow.com/a/22408965/2236315@adrianoesch)应该有所帮助(例如,解决“如果您知道不需要在注释中提到的笨拙解决方法的解决方案,更改列名,复制数据),那就太好了。”和“ ...要求复制数据”(@Frank提出)。

请注意,如果在某些文本编辑器中打开,则应看到标题字段的数量少于标题行下方的列数。在我的情况下,数据集的最后一个标头字段末尾有一个“,”。


0

看来问题可能是由多种原因引起的。当我遇到相同的错误时,需要执行以下两个步骤。

  1. 我将文件另存为MS-DOS csv。(之前将其保存为csv,excel starter 2010)。在记事本++中打开csv。没有昏迷是不一致的(如@Brian所述的一致性)。
  2. 注意我没有使用参数sep =“,”。我曾经使用过,并且有效(即使这是默认参数!)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.