rownames(y [33,])和rownames(y)[33]之间有什么区别?

时间:2013-11-03 11:33:47

标签: r

让我们对mtcars的数据进行研究。

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,它也有rownames。

1 个答案:

答案 0 :(得分:1)

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

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

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

你可以通过z&lt; - rownames(y [33,])&lt; - 'total'来检查这个;打印(z)表示。当z被打印时,我们有一个行名称,其值为'total'(在对rownames函数的调用中计算表达式y [33,]时创建的一行数据框)。

但是,如上所述,因为新创建的数据框未分配给变量;您随后检查数据框丢失的能力。因为它没有分配给任何变量,所以它最终将由R垃圾收集器清理。

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

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