【问题标题】:duplicate 'row.names' are not allowed error不允许重复的“row.names”错误
【发布时间】:2012-02-09 20:40:42
【问题描述】:

我正在尝试加载一个包含 14 列的 csv 文件,如下所示:

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

当我发出这个命令时:

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

我收到一条错误消息。

不允许有重复的行名

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

【问题讨论】:

  • 该链接 (getfile.pl?test.csv) 似乎不起作用。您能否将文件的前几行复制并粘贴到问题中,或者提供一个有效的链接?
  • 这只是一个例子。该链接是内部链接,您将无法访问它。文件格式是这样的:日期、var1、var2、var3、var4、var5 然后填充一些数据。我可以打开文件,它是准确的
  • systems getfile.pl?test.csv", header=FALSE, sep=","),我似乎得到了文件,但我知道我必须处理另一行。如果我打印系统的内容。这是它的外观:V1 V2 V3 V4 V5 开始日期、服务器、正常运行时间、负载、内存
  • 这个问题不再与(1)它的标题或(2)下面的答案有任何关系。 @minitech 只是在问题发布后仅四个小时就将您作为最后一次编辑的作者发给您……也许您知道如何挽救这个吸引了 20k 浏览量的问题。
  • @Frank:哎呀,谢谢!回滚。

标签: r csv r-faq


【解决方案1】:

我使用read_csv 来自readr package

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

read_csv 解决了这个问题。

【讨论】:

    【解决方案2】:

    This related question 指出了?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!!
    

    【讨论】:

      【解决方案3】:

      看来问题可能由多个原因引起。当我遇到相同的错误时,以下两个步骤有效。

      1. 我将文件保存为 MS-DOS csv。 (之前它被保存为 csv , excel starter 2010 )。 在记事本++中打开csv。没有昏迷不一致(一致性如上所述@Brian)。
      2. 注意到我没有使用参数 sep="," 。我用过,它有效(尽管这是默认参数!)

      【讨论】:

        【解决方案4】:

        @adrianoesch 的答案 (https://stackoverflow.com/a/22408965/2236315) 应该会有所帮助(例如,解决“如果您知道一个不需要在您的评论中提到的尴尬解决方法的解决方案(移动列名,复制数据),那会很棒。”和“......要求复制数据”由@Frank提出)。

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

        【讨论】:

          【解决方案5】:

          在我的例子中,每行末尾都有一个逗号。通过删除有效

          【讨论】:

            【解决方案6】:

            我在打开 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=",")
            

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                然后告诉 read.table not 使用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 吗?
                • 我之前尝试过,但没有成功。第一列现在称为“row.names”,列名进一步移动了一个单元格
                • @Tyler:是的,现在修复。谢谢!
                • “现在你的行将被简单地编号”不是完整的故事。正如您的评论表明您知道的那样,列名也被搞砸了。如果您知道不需要评论中提到的尴尬解决方法(移动列名,复制数据)的解决方案,那就太好了。 (不幸的是,“修复你的源数据”对于我的案例来说是不够的——它没有 OP 的问题,它遵循记录在案的行为 stackoverflow.com/a/15285380/1191259 。也许有一天我会把我的案例变成一个可重复的例子。)跨度>
                • OP 已经知道如何避免错误。实际上,您的答案不如他之前所做的,因为它会生成一个额外的列,需要复制数据。 (我写错了,它只是弄乱了列名。)
                猜你喜欢
                • 2020-12-10
                • 1970-01-01
                • 2014-05-11
                • 1970-01-01
                • 1970-01-01
                • 2014-12-13
                • 2015-07-31
                • 2019-09-12
                • 1970-01-01
                相关资源
                最近更新 更多