更改数据框的列名称

我有一个名为“newprice”(见下文)的数据框,我想改变我的程序中的列名。

> 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()函数,但无济于事。

有人能帮我弄清楚吗?

使用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" 

我使用这个:

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

错误是由“聪明引号”(或任何他们被称为)造成的。 这里的教训是,“不要在一个将引号转换为聪明引号的编辑器中编写代码”。

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

另外,你不需要paste("premium")paste的调用是多余的),为了避免混淆(例如x <- -10; if(x<-3) "hi" else "bye"; x )。

你是否尝试过:

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

新推荐的方法是使用setNames函数。 看到?setNames 。 由于这会创builddata.frame的新副本,因此如果这是您的意图,请务必将结果分配给原始data.frame

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

如果您使用前面的答案build议的某些方式使用colnames ,R的较新版本会给你警告。

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

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

我有同样的问题,这段代码为我工作。

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

简而言之,这个代码执行以下操作:

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

[names(data) == oldVariableName]提取要更名的variables名称( oldVariableName ),并且<- "newVariableName"分配新的variables名称。

类似于其他:

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

非常简单和容易修改。

您可以通过以下方式进行编辑:

 newprice <- edit(newprice) 

并手动更改列名称。

尝试:

 names(newprice) <- c("premium", "change", "newprice") 

如果您只需要知道旧列名称,就可以一次只重命名多个列,您可以使用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 

只是为了纠正和稍微扩大斯科特威尔逊的答案
你也可以在data.frames上使用data.table的setnames函数。

不要期望加快操作速度,但是你可以期望setnames对于内存消耗更有效率,因为它通过引用来更新列名。 这可以跟踪addressfunction,见下文。

 library(data.table) set.seed(123) n = 1e8 df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n)) address(df) #[1] "0x208f9f00" colnames(df) <- c("good", "better") address(df) #[1] "0x208fa1d8" rm(df) dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n)) address(dt) #[1] "0x535c830" setnames(dt, c("good", "better")) address(dt) #[1] "0x535c830" rm(dt) 

所以,如果你正在达到你的记忆限制,你可能会考虑使用这个。

你可以直接做完

 names(newprice) <- c("premium","change","newprice") 

您正在使用的粘贴命令至less需要2个参数。 它像excel中的连接函数一样工作,这就是为什么它给你一个错误,我想。

这可能会有所帮助:

 rename.columns=function(df,changelist){ #renames columns of a dataframe for(i in 1:length(names(df))){ if(length(changelist[[names(df)[i]]])>0){ names(df)[i]= changelist[[names(df)[i]]] } } df } 

DF = rename.columns(DF,列表(old.column = 'new.column.name'))