提问



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


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

最佳参考


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

其它参考1


我用这个:


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

其它参考2


这个错误是由智能引号(或者它们被调用的任何东西)引起的。这里的教训是,不要在编辑器中编写代码,将引号转换为智能引号。


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


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

其它参考3


你有没有尝试过:


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


?

其它参考4


新建议的方法是使用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")

其它参考5


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


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


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


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


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

其它参考6


与其他人类似:


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


非常简单易于修改。

其它参考7


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


newprice <- edit(newprice)


并手动更改列名称。

其它参考8


尝试:


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

其它参考9


如果只知道旧列名称时需要一次重命名除多列以外的所有列,则可以使用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

其它参考10


只是为了纠正并略微扩展Scott Wilson的回答。

您也可以在data.frames上使用data.tables setnames函数。


不要指望操作加速,但是你可以期望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)


因此,如果你达到内存限制,你可以考虑使用这个。

其它参考11


你可以直接做完了


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


您正在使用的粘贴命令至少需要2个参数。它的工作方式类似于excel中的连接函数,这就是为什么它会给你一个错误。

其它参考12


这可能会有所帮助:


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))

其它参考13


我的专栏名称如下


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


我想更改Class和Sex的列名


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

其它参考14


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


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


我们更改DF1的名称如下


 colnames(DF1)<- colnames(DF2)

其它参考15


dplyr有几个选项:


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
  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::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