首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >row.names()和attributes$row.names有什么区别?

row.names()和attributes$row.names有什么区别?
EN

Stack Overflow用户
提问于 2014-08-04 17:22:13
回答 1查看 1.6K关注 0票数 4

row.names(iris)返回一个字符向量:

代码语言:javascript
复制
> row.names(head(iris))
[1] "1" "2" "3" "4" "5" "6"

attributes(iris)$row.names返回一个整数向量:

代码语言:javascript
复制
> attributes(head(iris))$row.names
[1] 1 2 3 4 5 6

我感到惊讶的是,这两个函数不返回相同的东西。他们之间有什么区别?

EN

回答 1

Stack Overflow用户

发布于 2015-01-10 02:07:43

row.names()是一个通用的方便函数。正如注释中指出的那样,数据框架是一个具有(至少)属性"names""row.names""class"属性的列表对象。

代码语言:javascript
复制
> dput(data.frame("x" = c(1, 2, 3)))
structure(list(x = c(1, 2, 3)), .Names = "x", row.names = c(NA, -3L), class = "data.frame")

structure()内部,变量名被传递给参数.Names (而不是names)。

在基本包中,泛型函数有两种方法:

代码语言:javascript
复制
> methods(row.names)
[1] row.names.data.frame row.names.default

默认方法是

function (x) if (!is.null(dim(x))) rownames(x)

而数据帧(row.names.data.frame)的方法是

function (x) as.character(attr(x, "row.names"))

如果没有定义行名,row.names将是一个包含两个元素的向量,第一个元素是NA,第二个是负行数(nrow(iris)为150)。

使用row.names()attributes()的一个重要区别是后者可以破坏数据帧:

代码语言:javascript
复制
> a <- b <- data.frame("x" = c("obs1" = 4, "obs2" = 6, "obs3" = -1))
> a
      x
obs1  4
obs2  6
obs3 -1
> row.names(a) <- NULL
> a
   x
1  4
2  6
3 -1
> attributes(b)$row.names <- NULL
> b
[1] x
<0 rows> (or 0-length row.names)

由于属性在b中被完全删除,用于data.frame的方法将不再正常工作:

代码语言:javascript
复制
> str(b)
'data.frame':   0 obs. of  1 variable:
 $ x: num  4 6 -1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25124199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档