首页 文章

为什么`row.names`优于`rownames`?

提问于
浏览
23

R核心库中有两个功能 .

  • row.names获取并设置数据框的行名称

  • rownames检索或设置类矩阵对象的行名称 .

但是 row.names 的文档指定对于数据框,'rownames'和'colnames'最终分别调用'row.names'和'names',但后者是首选 . 为什么 row.names 首选?忽略 row.names 并且只是调用 rownames 会不会更容易?

1 回答

  • 12

    row.names() 是S3泛型函数,而 rownames() 是较低级别的非泛型函数 . rownames() 实际上是 row.names() 的默认方法,在没有更具体的方法的情况下应用于任何对象 .

    如果您正在操作数据框 x ,那么使用 row.names(x) 会更有效,因为数据帧有一个特定的 row.names() 方法 . 数据框的 row.names() 方法只提取已存储在 x 中的 "row.names" 属性 . 相比之下,由于 rownames() 的定义以及函数之间的相互关系, rownames(x) 必须提取 x 的所有维名称,然后删除列名,然后与 names(x) 结合,然后再次删除 names(x) . 此过程甚至涉及调用 row.names(x) 作为中间步骤 . 这通常会很快发生,你没有注意到它,但只是提取属性显然更有效 .

    如果您不想打扰区分这两个函数,那么始终只使用通用版本 row.names() 是合乎逻辑的,因为它总是调度适当的方法 . 例如,如果 x 是一个矩阵,那么 row.names(x) 只是干净地传递到 rownames(x) ,因为该类对象没有更具体的方法 .

相关问题