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我感到惊讶的是,这两个函数不返回相同的东西。他们之间有什么区别?
发布于 2015-01-10 02:07:43
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 -1https://stackoverflow.com/questions/25124199
复制相似问题