0

让我们对 mtcars 的数据进行 rbind。

apply(mtcars,2,sum)->x
rbind(mtcars,x)
rbind(mtcars,x)->y

为什么rownames(y[33,])<-"total"y[33,]的名字不能改?
为什么rownames(y)[33]<-"total"y[33,]的名字可以改?
它们之间有什么区别?

> y[33,]
     mpg cyl   disp   hp   drat      wt   qsec vs am gear carb
33 642.9 198 7383.1 4694 115.09 102.952 571.16 14 13  118   90
> rownames(y[33,])
[1] "33"
> class(y[33,])
[1] "data.frame"

y[33,] 不是向量,是 data.frame,它也有行名。

4

1 回答 1

1

当您对数据框进行子集化以获得一行 (y[33,]) 时,它会创建一个新的(一行)数据框。

但是,由于此子设置发生在函数调用中,因此新创建的一行数据框未分配给变量。这使得后续检查该行数据帧变得困难。

信不信由你,您已成功将该数据框中的一行的名称更改为“总计”。

您可以通过 z <- rownames(y[33,]) <- 'total'; 来检查这一点。打印(z)。打印 z 时,我们有一个值为“total”的行名称(来自在对 rownames 函数的调用中计算表达式 y[33,] 时创建的单行数据框)。

但是,正如我上面提到的,因为新创建的数据框没有分配给变量;您随后检查该数据框的能力丢失了。因为它没有分配给任何变量,它最终会被 R 垃圾收集器清理掉。

另一方面,rownames(y) 从分配给 y 的数据框中产生所有 33 个行名。行名称在向量中。使用数字索引 33 和分配,确保更改所需的行名。因为数据框对象被赋值给变量y;您可以事后检查它以查看是否发生了更改。

希望这有助于解释您的两个看起来相似但实际上非常不同的表达方式。

于 2013-11-03T12:11:54.073 回答