【问题标题】:R error: "duplicate 'row.names' are not allowed"R错误:“不允许重复的'row.names'”
【发布时间】:2020-12-10 18:39:48
【问题描述】:

当我想将第一列设置为行名时出现错误:

dt <- fread('../data/data_logTMP.csv', header = T)
rownames(dt) <- dt$GENE

我使用duplicated() 来检查值:

> which(duplicated(dt$GENE) == TRUE)
[1] 20209 21919

因此,我比较了这些值:

> dt$GENE[20209] == dt$GENE[21919]
[1] FALSE
> dt$GENE[20209]
[1] "1-Mar"
> dt$GENE[21919]
[1] "2-Mar"

为什么这两个值被识别为重复?我该如何解决这个问题?

【问题讨论】:

  • 您使用了 fread,因此您的 dt 是一个 data.table。 data.tables 不使用行名;您尝试分配行名的目标是什么?
  • 关于您的问题,这不是重复的工作方式。 duplicated 的输出告诉您重复元素的索引,但 该元素的第一个实例 位于向量中的其他位置。看看重复的(c(1, 1, 2, 3))
  • 没有创建一个可以有行名的数据框?我使用了 is.data.frame(dt) 并得到了 True。我尝试了示例 duplicated(c(1, 1, 2, 3)),我知道第一个数字不能被识别为重复。我发现了真正的重复值。非常感谢!
  • is.data.frame 将是TRUE,因为data.tabledata.frame扩展(您可以查看class(dt))。行名是扩展有点混乱的地方; data.table 更喜欢使用 keys 而不是行名;见this vignette
  • 谢谢你这么详细的解释!

标签: r


【解决方案1】:

当您使用 fread 读取文件时,对象 dt 的默认类将是 data.table。按照设计,data.table 将不支持 row.names。因此,您需要向 fread 传递一个附加参数,如下所示,以确保您正在读取的对象的类不是 data.table。

data.table::fread(input = "file name",sep = ",",header = T,data.table = FALSE)

【讨论】:

  • 我添加了参数data.table = FALSE 并且能够更改行名。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2015-07-31
  • 2019-09-12
相关资源
最近更新 更多