更改数据框的列名


399

我有一个名为“ 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()功能,但无济于事。

有人可以帮我解决这个问题吗?


如果Dirk的答案有效,那么问题是您正在使用矩阵而不是数据框。您可以使用is.matrix或进行检查str
IRTFM


8
colnames(newprice)<- c("premium","change","newprice")
东阮

您的错误与代码的质量无关。您只是使用了错误的符号。R无法识别此“,请改用”。我知道它们看起来可能相同。仔细观察:“”。而已。
Edo

Answers:


592

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

12
@Dirk为什么不使用names()而不是colnames()?
安托万·利泽(AntoineLizée),

4
大!您还可以一次子集多个列(在大数据框架上很有用)。colnames(X)[c(1,2)] <- c("good", "better")
metakermit

7
尝试setnames()data.table包中。使用类似setnames(DT,"b","B")setnames(DT,c("a","E"),c("A","F"))
dwstu

奇怪的是,在设置了数据框的列名之后q1,尝试使用dplyras 突变数据框会q1 <- q1 %>% mutate(rel_count = count / 482462)导致错误Error in mutate_impl(.data, dots) : unknown column 'days'(其中days为该列赋予了新名称)。这真令人沮丧。
David Tonhofer

176

我用这个:

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

7
谢谢。我认为这对R很烦人:如果您不想使用索引号而是旧名称,为什么更改列名称如此困难:(
Arne

10
此方法的优点是,只要知道列的原始名称,就不必担心列的位置。我认为这是首选的方法,因为您稍后可能会更改代码以更改要重命名的列的位置。
Paulo S. Abreu 2015年

78

该错误是由“智能引号”(或称为“智能引号”)引起的。这里的教训是,“不要在将引号转换为智能引号的“编辑器”中编写代码”。

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

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


51

您是否尝试过:

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


42

推荐的新方法是使用该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")

2
认为是要求data.frame,而不是data.table
Helix123

35

我遇到了同样的问题,这段代码为我解决了。

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

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

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

[names(data) == oldVariableName]提取oldVariableName要重命名的变量名(),并<- "newVariableName"分配新的变量名。


如果您有一个包含3个oldVariableNames的向量,这将如何工作?
jiggunjer

正是我想要的-> 2大拇指!
SilSur

19

与其他类似:

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

非常简单,易于修改。



10

如果您只需要知道旧的列名,而不必一次重命名,而是一次重命名多个列,则可以使用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

1
该代码假定您的列名顺序与插入顺序相同
Hillary Sanders

10

使用此功能通过列名功能更改列名。

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

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

newprice <- edit(newprice)

并手动更改列名称。


这不只适用于向量和因子元素吗?> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond

它至少适用于数据帧。这就是我所知道的。
Baykal 2014年

7

我的列名如下

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

我想更改类别和性别的列名称

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

7

有一对夫妇选择dplyr::rename()dplyr::select()

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

还有以下三个范围的变体dplyr::rename()dplyr::rename_all()用于所有列名,dplyr::rename_if()有条件地定位列名和dplyr::rename_at()选择命名列。下面的示例用下划线替换空格和句点,并将所有内容都转换为小写:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() 也可以类似的方式使用:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

只是为了纠正和稍微扩展Scott Wilson的答案。
您也可以setnames在data.frames上使用data.table的功能。

别指望操作会加快速度,但是您可以期望这样setnames做会提高内存使用效率,因为它可以通过引用更新列名。可以使用address功能进行跟踪,请参见下文。

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)

因此,如果您遇到了内存限制,则可以考虑改用此限制。


3

这可能会有所帮助:

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
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

如果我们有2个数据框,则以下工作

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

我们如下更改DF1的名称

 colnames(DF1)<- colnames(DF2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.