3

我想重命名中的列名data.frame

> x=data.frame(name=c("n1","n2"),sex=c("F","M"))
> colnames(x[1])="Name"
> x
  name sex
1   n1   F
2   n2   M
> colnames(x)[1]="Name"
> x
  Name sex
1   n1   F
2   n2   M
> 

为什么不起作用colnames(x[1]) = "Name",whilecolnames(x)[1]="Name"呢?

是什么原因?他们之间有什么区别?

4

2 回答 2

5

信息过多的答案:如果您查看每个选项“脱糖”的内容:

# 1.
`[<-`(x, 1, value=`colnames<-`(x[1], 'Name'))
# 2.
`colnames<-`(x, `[<-`(colnames(x), 1, 'Name'))

第一个选项仅从第一列创建一个新的 data.frame,重命名该列(成功),然后尝试将该 data.frame 分配回第一列。[<-.data.frame将传播这些值,但不会根据value.

第二个选项获取 data.frame 的 colnames,更新第一个值,并使用更新的名称创建一个新的 data.frame。


(在这里回答@Peng Peng 的问题,因为我不知道如何让反引号引用在评论中起作用......)

反引号是引用变量名。考虑这里的区别:

x<-1
`x<-`<-1

第一个将 1 分配给名为 x 的变量,但第二个将 1 分配给名为 的变量x<-。这些不常用的变量名称实际上由<-原始函数使用 - 您可以在赋值的 lhs 上进行任意函数调用,并且<-附加到名称的函数指定如何执行更新(类似于setf在 lisp 中)。

于 2012-07-30T00:07:11.297 回答
1

因为要修改xdata.frame的列名属性。因此

colnames(x) <- ....

是正确的,无论您是否同时分配一个或多个。

于 2012-07-29T23:19:32.190 回答