【问题标题】:reading a csv file with repeated row names in R在R中读取具有重复行名的csv文件
【发布时间】:2017-08-07 22:52:07
【问题描述】:

我正在尝试读取具有重复行名但无法读取的 csv 文件。我收到的错误消息是Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed.

我使用的代码是:

S1N657 <- read.csv("S1N657.csv",header=T,fill=T,col.names=c("dam","anim","temp"))

我的数据示例如下:

did <- c("1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657")
aid <- c(101,102,103,104,105,106,107,108,109,110)
temp <- c(36,38,37,39,35,37,36,34,39,38)

data <- cbind(did,aid,temp)

我们将不胜感激。

【问题讨论】:

标签: r row names


【解决方案1】:

函数看到重复的行名,所以你需要处理它。可能最简单的方法是使用 row.names=NULL,这将强制行编号 - 换句话说,它将您的第一列视为第一个维度,而不是行号,因此添加行号(以“1”开头的连续整数。

read.csv("S1N657.csv", header=T,fill=T, col.names=c("dam","anim","temp"), row.names=NULL)

【讨论】:

  • 没错道格!我看到它已将我的第一列(大坝 ID)视为您所说的第一个维度。我排除了 [,-1] 位,然后重命名我的列以处理添加的额外列。非常感谢!
  • @Bazon,您的标题没有第一列的名称。如果你给它一个名字,问题就会自动解决。
  • 嗨,道格,row.names=NULL 之前不应该有逗号,这样脚本就会是:read.csv("S1N657.csv", header=T,fill=T, col .names=c("dam","anim","temp"), row.names=NULL
  • 是的,谢谢——一个错字,刚刚编辑在最后两个参数之间添加逗号。
  • row.names=NULL 实际上并没有解决问题,它只是掩盖了它。请添加建议以检查标题数量是否与值的数量匹配。
【解决方案2】:

试试这个:

S1N657 <- read.csv("S1N657.csv",header=T,fill=T,col.names=c("dam","anim","temp"), 
          row.names = NULL)[,-1]

【讨论】:

  • 嗨,kohske,这行得通。你能解释一下该代码的最后一部分:[,-1]好吗?非常感谢!
  • 嗨,kohske,在运行脚本后,我发现脚本的 [,-1] 部分删除了行名或我的 dam id (did)。
  • 是的,你是对的。如果您需要第一列(可能是每行的重复名称),请从上面的代码中删除 [,-1]。
  • koshke,我排除了脚本的 [,-1] 部分,因为我仍然需要我的第一列(大坝 ID)并重命名我的列以处理创建的额外列。非常感谢!
  • 我认为使用header = TRUE 比删除第一行更好。
【解决方案3】:

猜测你的 csv 文件是从 xlsx 转换而来的。在第一行的末尾添加一个逗号,删除最后一行,完成

【讨论】:

  • 您的回答似乎没有解决所提出的问题,而且质量低下。请考虑详细说明
  • 这实际上很有帮助...正如上面 Travis Heeter 所解释的,这可能是由于标题中缺少列。如果是这种情况,解决方法是在文本编辑器中打开文件,在第一行末尾添加一个逗号并保存。之后应该可以找到。
【解决方案4】:

我最近遇到的一个问题是标题行中的列数与我在数据本身中的列数不匹配。例如,我的数据是制表符分隔的,所有数据行都有一个尾随制表符。标题行(我手动添加的)没有。

我希望对行进行自动编号,但它却将我的第一行作为行名。来自文档(重点由我添加):

row.names 行名称向量。这可以是一个给出实际行名的向量,或者是一个给出包含行名的表列的单个数字,或者是给出包含行名的表列名的字符串。

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

使用 row.names = NULL 强制行编号。缺少或为 NULL 的 row.names 生成的行名被认为是“自动的”(而不是由 as.matrix 保留)。

在表头行中增加一个制表符,使表头行的列数与数据行的列数相同,从而解决问题。

【讨论】:

    【解决方案5】:

    简而言之,检查您的列名。如果您的第一行是列的名称,则可能缺少一个或多个名称。

    例子:

    "a","b","c"
    a,b,c,d
    a,b,c,d
    

    上面的例子会导致 row.name 错误,因为每行有 4 个值,但只有 3 列被命名。

    这发生在我从在线资源构建 csv 时。

    【讨论】:

      【解决方案6】:

      对于小型 CSV,我遇到了相同的“不允许重复的 'row.names'”错误。问题是在我想要的 14x14 图表区域之外的某个地方有一个带有空格/其他数据的随机单元格。

      当我运行它“row.names = NULL”时发现了答案,并且我的表下方有多行空白数据(因此多个重复的行名都是“空白”)。

      解决方案是删除表格区域外的所有行/列,并且成功了!

      【讨论】:

        【解决方案7】:

        在我的情况下,问题来自 excel 文件。虽然它看起来井井有条,但它并没有奏效,我总是收到这样的信息:Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed.

        我尝试将我的 excel 矩阵复制粘贴到一个新的空 Excel 表中,然后我尝试阅读它:它成功了!没有错误信息了!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 1970-01-01
          • 2021-01-12
          相关资源
          最近更新 更多