row.names()和属性$ row.names之间的区别是什么?

时间:2014-08-04 17:22:14

标签: r dataframe

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

> row.names(head(iris))
[1] "1" "2" "3" "4" "5" "6"

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

> attributes(head(iris))$row.names
[1] 1 2 3 4 5 6

我很惊讶这两个函数不会返回相同的东西。它们之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

row.names()是一个通用的便利功能。正如评论中所指出的,数据框是一个列表对象,其中包含(至少)属性"names""row.names""class"

> 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)。

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

> 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()之间的一个重要区别是后者可能会破坏数据框:

> 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的方法不再适用:

> str(b)
'data.frame':   0 obs. of  1 variable:
 $ x: num  4 6 -1