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

问题描述:

我想在data.frame重命名列名,colnames(x [1])< - “name”和colnames(x)[1] < - “name”之间的区别是什么?

> 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"呢?

是什么原因?他们之间有什么不同?

的信息太多了答案: 如果你看一下每个选项“脱糖”到:

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

第一个选项,使新data.frame只在第一个栏,重命名该列(成功),然后尝试将该数据帧分配回第一列。 [<-.data.frame将传播值,但不会基于value的名称重命名现有列。

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


(答案在这里@Peng鹏的问题,因为我无法弄清楚如何让反引号引用的注释工作...)

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

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

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

+0

+1击败我。很好的解释。 – joran 2012-07-30 00:08:08

+0

\''colnames 2012-07-30 01:55:20

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

colnames(x) <- .... 

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

+2

@彭鹏如果不清楚,'x [1]'是一个数据框,但它是一个全新的数据框,恰好是'x'的第一列。更改新数据框的列名不会返回并更改'x'中的列名。 – Gregor 2012-07-29 23:49:56

+0

谢谢@shujua。突出显示x [1 [与x不同的数据框有帮助。 – 2012-07-30 00:39:59