更改数据框的列名称
我有一个名为“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
对于内存消耗更有效率,因为它通过引用来更新列名。 这可以跟踪address
function,见下文。
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'))