【问题标题】:Duplicate row names in R using as.data.frame()使用 as.data.frame() 在 R 中重复行名
【发布时间】:2018-08-08 10:46:15
【问题描述】:

在 R 数据框中,行名必须是唯一的。

df <- mtcars
rownames(df) <- rep("duplicate!", nrow(df))
> Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
>   duplicate 'row.names' are not allowed
> In addition: Warning message:
> non-unique value when setting 'row.names': ‘duplicate!’ 

或者

df <- data.frame(mtcars, row.names=rep("duplicate!", nrow(mtcars)))
> Error in data.frame(mtcars, row.names = rep("duplicate!", nrow(mtcars))) : 
  duplicate row.names: duplicate!

那么,as.data.frame() 以下行为的动机是什么?这是故意的还是错误的?

m <- as.matrix(mtcars)
rownames(m) <- rep("duplicate!", nrow(m))
df <- as.data.frame(m)

结果如下:

any(duplicated(rownames(df)))  # == TRUE
nrow(df)  # == 32
length(unique(rownames(df)))  # == 1
df["duplicate!", ]  # returns a single row...
>            mpg cyl disp  hp drat   wt  qsec vs am gear carb
> duplicate!  21   6  160 110  3.9 2.62 16.46  0  1    4    4

(使用 R 版本 3.4.3 (2017-11-30) 运行)

【问题讨论】:

  • 这似乎是一个错误。考虑到只调用df 会导致错误(Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : duplicate row.names: duplicate!),我想说这个错误应该在调用as.data.frame(m) 时弹出。
  • 对,但试试View(df)(在 RStudio v1.1.414 中)
  • 这并不能回答你的问题,而是在你输入head(df)时查看行名
  • @G5W head() 追加“\.\d+”,但调用 rownames(df) 会返回我们重复的行名。
  • 通过快速浏览 24 个(根据我的计数)as.data.frame 方法源,除了 as.data.frame.matrix 之外的每个源都明确确保没有重复的行名,或者在某些时候让 data.frame 做繁重的工作也确保没有重复的行名。所以我倾向于猜测这不是故意的行为,可以称为错误。或者我有限的想象力让我无法猜测为什么应该允许这样做。

标签: r dataframe duplicates rowname


【解决方案1】:

是的,正如 Martyn Plummer 在官方 R-devel 邮件列表中确认的那样 (https://stat.ethz.ch/mailman/listinfo/r-devel/) 在他的reply 中,这是一个错误,我可能很快会提交对修复该错误的源的更改。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多