colnames(x [1])< - “name”和colnames(x)[1]< - “name”之间有什么区别?

时间:2012-07-29 23:12:54

标签: r

我想在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"不起作用,而colnames(x)[1]="Name"呢?

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

2 个答案:

答案 0 :(得分: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。


(在这里回答@彭鹏的问题,因为我无法弄清楚如何在评论中起作用反引词......)

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

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

第一个为一个名为x的变量赋值1,但第二个赋值给一个名为x<-的变量。这些不常见的变量名实际上由<-原语函数使用 - 允许对赋值的lhs进行任意函数调用,并且在名称后附加<-的函数指定如何执行更新(类似于lisp中的setf

答案 1 :(得分:1)

因为您要修改x的列名属性,即data.frame。因此

colnames(x) <- ....

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