数据框的列名更改

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个回答

13

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

1
请参考dplyr :: rename_with()以获取更新的tidyverse方法。 - Bryan Shalloway

10

只是为了更正和略微扩展Scott Wilson的回答。
您也可以在数据框上使用data.table的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)

因此,如果您遇到了内存限制的问题,您可以考虑使用这个替代品。


10

尝试:

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

8
你可以通过以下方式进行编辑:
newprice <- edit(newprice)

并手动更改列名。


这个只适用于向量和因子元素,对数据框不起作用。> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements - vagabond
至少对于数据框架是有效的。这就是我所知道的。 - Baykal

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

2

更改数据框的列名

colnames(dataset)[colnames(dataset) == 'name'] <- 'newcolumnname'

2
如果我们有两个数据框,以下操作可行。
 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

我们将DF1的名称更改如下:
 colnames(DF1)<- colnames(DF2)

1

使用data.table的一种选项:

library(data.table)

setDT(dataframe)

setnames(dataframe,'Old1','New1')
setnames(dataframe,'Old2','New2')

-1
这对我来说可行:
newprice<- setNames(newprice, c("premium", "change", "newprice"))

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