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
我很惊讶这两个函数不会返回相同的东西。它们之间的区别是什么?
答案 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