数据框的列名更改

483

我有一个名为"newprice"的数据框(见下文),我想在R程序中更改列名。

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

实际上这就是我正在做的:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

我没有将这个放在循环中,因为我希望每个列名都不同,正如你所看到的。

当我将我的程序粘贴到R控制台时,它给出的输出如下:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

我也尝试过使用c()功能,例如c("premium"),而不是paste()函数,但没有成功。

有人能帮助我弄清楚这个问题吗?


1
如果Dirk的答案有效,那么问题就是你正在使用矩阵而不是数据框。您可以使用is.matrixstr来检查这一点。 - IRTFM
5
请看这篇有关dplyr::rename的回答:https://dev59.com/_2Ei5IYBdhLWcg3wNqDN#26146202。 - Rasmus Larsen
17
将新的列名设置为 "premium"、"change" 和 "newprice"。 - Tung Nguyen
4
你的错误与你的代码质量无关,只是使用了错误的符号。R不能识别这个“符号,请使用双引号"。尽管它们看起来很相似,但仔细看一下:“ ”。“那就是正确的符号。 - Edo
下面有几个答案使用硬编码的位置,例如在 colnames(X)[2] 中使用 2。这通常不是一个好的做法,因为它对数据变化很敏感。如果您向数据中添加另一列到这个特定列之前会怎样呢?相反,尝试像 Hagos 提供的答案那样做。 - Jason Goal
19个回答

691

使用colnames()函数:

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

你也可以进行子集检索:

R> colnames(X)[2] <- "superduper"

16
为什么不使用names()而是用colnames()? - Antoine Lizée
9
太好了!您还可以一次子集多列(在大型数据框中很有用)。 colnames(X)[c(1,2)] <- c("good", "better") - metakermit
8
请尝试在data.table包中使用setnames()函数。类似于setnames(DT,"b","B")setnames(DT,c("a","E"),c("A","F"))这样的语句。该函数可用于修改数据表的列名。 - dwstu
奇怪的是,在设置数据框“q1”的列名后,尝试使用“dplyr”对数据框进行变异,例如“q1 <- q1%>% mutate(rel_count = count / 482462)”,结果会出现错误“Error in mutate_impl(.data,dots):unknown column 'days'”(其中“days”是给该列赋予的新名称)。这真的很令人沮丧。 - David Tonhofer

233

我使用这个:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

11
谢谢。我认为使用R有点令人烦恼:如果您不想使用索引号而是旧名称,那么更改列名为什么这么困难 :( - Arne
12
这种方法的优点是只要你知道原始名称,就不必担心列的位置。我认为这是首选方法,因为您可能会以后更改代码,导致您想要重新命名的列的位置发生变化。 - Paulo S. Abreu
1
您可以使用data.table::setnames(dataframe,'Old','New')进行数据表的列名更改。 - kakarot

90

这个错误是由“智能引号”(或者叫其他名字)引起的。教训就是:“不要在将引号转换为智能引号的‘编辑器’中编写代码。”

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

另外,你不需要使用paste("premium")(调用paste是多余的),并且在<-周围放置空格是一个好主意,以避免混淆(例如x <- -10; if(x<-3) "hi" else "bye"; x)。


75

尝试:

names(newprice)[1] <- "premium"

55

现在推荐使用setNames函数来完成这个操作。请参见?setNames。由于这会创建一个新的data.frame的副本,如果这是您的意图,请务必将结果分配给原始的data.frame

data_frame <- setNames(data_frame, c("premium","change","newprice"))

如果您使用早期答案中建议的某些方式使用colnames,较新版本的R将会给出警告。

如果这是一个data.table,则可以使用data.table函数setnames,它可以通过参照修改特定列名或单个列名:

setnames(data_table, "old-name", "new-name")

52

我遇到了同样的问题,而这段代码对我起了作用。

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

简而言之,这段代码做了以下几个步骤:

names(data) 查看数据框 (data) 中所有变量的名称。

[names(data) == oldVariableName] 提取要更改名称的变量名称 (oldVariableName),<- "newVariableName" 为其分配新的变量名称。


如果您有一个包含3个旧变量名称的向量,那么这将如何工作? - jiggunjer
正是我所寻找的 -> 两个大拇指赞! - SilSur
很好,没有硬编码索引。 - Jason Goal

28

与其他类似:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

非常简单易懂,且易于修改。


23
使用colname函数更改列名称。
colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

13

如果您需要一次重命名不是全部而是多个列,但只知道旧的列名,可以使用colnames函数和%in%运算符。例如:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

现在您想将“坏”和“最坏”的字词替换为“好”和“最好”。您可以使用

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

这会导致

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

2
该代码假设您的列名排序等于插入的顺序。 - Hillary Sanders

13

我的列名如下

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

我想要更改“班级”和“性别”的列名。

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接