不允许出现重复的“ row.name”错误

我试图加载一个 csv 文件,它有14列,如下所示:

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

当我发出这个命令时:

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

我收到一个错误消息。

不允许重复的 row.name

在我看来,是第一个列名导致了这个问题。当我手动下载文件并从文件中删除 StartDate名称时,R 成功地读取文件并将第一列名称替换为 X。谁能告诉我这是怎么回事?该文件是一个(以逗号分隔的) csv 文件。

197384 次浏览

然后告诉 read.table 没有使用 row.names:

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

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

还要看看 read.csv,它是 read.table的包装器,read.table已经设置了 sep=','header=TRUE参数,因此您的调用简化为

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

这个相关的问题 指出了 ?read.table文档中解释您的问题的一部分:

如果有一个标题,并且第一行包含少一个字段 除了列数之外,还要使用输入中的第一列 否则,如果 row.name 丢失,则对行进行编号。

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

  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!!

这个问题似乎可以由不止一个原因引起。当我有相同的错误时,以下两个步骤是有效的。

  1. 我把文件保存为 MS-DOS csv。(早些时候它被保存为 csv,excel starter 2010)。 在记事本 + + 中打开 csv。没有昏迷不一致(如上面@Brian 描述的一致性)。
  2. 注意到我没有使用参数 Sep =”,”。我使用并且它工作(即使这是默认参数!)

这里(https://stackoverflow.com/a/22408965/2236315)@adrianoesch 的答案应该会有帮助(例如,解决“如果你知道一个解决方案,不需要在你的评论中提到的尴尬的解决方案(转移列名,复制数据) ,那将是巨大的。”以及@Frank 提议的“ ... 要求复制数据”。

请注意,如果在某些文本编辑器中打开,您应该会看到标题字段的数量小于标题行下面的列数。在我的例子中,数据集在最后一个头字段的末尾缺少一个“ ,”。

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

我在打开一个 CSV 文件时出现了这个错误,其中一个字段中嵌入了逗号。字段周围有引号,我剪切并粘贴了 read.table,其中包含 quote = “”。一旦我删除了 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=",")

在我的例子中,每一行的末尾都有一个逗号

我用的是 readr 包裹中的 read_csv

根据我的经验,read.csv函数中的参数 row.names=NULL将导致对 如果缺少一个列名,每个列都会被移位。

read_csv解决了这个问题。