将colnames()分配给数据框的特定列

时间:2010-09-21 03:09:03

标签: r

我对基础包中的colnames函数有疑问

假设您有一个data.frame,如下所示:

df <- data.frame(variable = letters[1:100], value = rnorm(100))

正如人们所料,colnames(df[1])会返回:

colnames(df[1]) 
# [1] "variable"

但是,调用特定列

时似乎无法进行分配
colnames(df[1]) <- c("test")
colnames(df[1])
# [1] "variable"

为什么?

3 个答案:

答案 0 :(得分:7)

因为你应该这样做:

> colnames(df)[1] <- "test"
> colnames(df)[1]
[1] "test"

colnames函数返回一个可以改变的字符向量。

答案 1 :(得分:4)

您的版本没有按预期执行的原因是df[1]在内存中创建临时数据框,然后colnames函数更改此临时数据框中的1列的名称(而不是原始数据框) ),但是暂时的df没有其他任何事情,所以它被静默地丢弃。您的原始数据框从未被触及过,因此下次执行colnames(df[1])时,会创建一个新的临时df,从未修改的原始文件中复制并返回该名称。

更改调用colnames和子集的顺序会按照其他答案显示您想要的内容。

答案 2 :(得分:3)

通过索引调用数据帧(整个数据帧)上的 colnames()函数然后访问,该函数调用返回的1D向量项:

> data(Orange)    
> Orange[1:5,]
  Tree  age circumference
1    1  118            30
2    1  484            58
3    1  664            87
4    1 1004           115
5    1 1231           120
> call *colnames* on the Orange dataframe and bind it to the variable *cn*
> cn = colnames(Orange)
> cn    
[1] "Tree"          "age"           "circumference"
> length(cn)
[1] 3
> class(cn)
 [1] "character"

> # access the items of this 1D character vector by index:
> cn[1]
[1] "Tree"
> cn[3]
[1] "circumference"
> # likewise modify any item the same way:
> cn[3] = '2*pi*r'