更改数据框的列名称

Son*_*Son 370 r rename dataframe

我有一个名为"newprice"的数据框(见下文),我想在R中改变程序中的列名.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164
Run Code Online (Sandbox Code Playgroud)

事实上,这正在做什么:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 
Run Code Online (Sandbox Code Playgroud)

我没有将它放在循环中,因为我希望每个列名称与您看到的不同.

当我将程序粘贴到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(“"
Run Code Online (Sandbox Code Playgroud)

我同样尝试使用该c()功能 - 例如c("premium"),而不是paste()功能,但无济于事.

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

Dir*_*tel 565

使用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
Run Code Online (Sandbox Code Playgroud)

你也可以分组:

R> colnames(X)[2] <- "superduper"
Run Code Online (Sandbox Code Playgroud)

  • @Dirk为什么不使用names()而不是colnames()? (12认同)
  • 在`data.table`包中尝试`setnames()`.使用类似`setnames(DT,"b","B")`或`setnames(DT,c("a","E"),c("A","F")) (6认同)
  • 大!您还可以一次对多个列进行子集化(对大数据帧很有用).`colnames(X)[c(1,2)] < - c("good","better")` (2认同)

Mat*_*ira 163

我用这个:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Run Code Online (Sandbox Code Playgroud)

  • 你不需要那个命令中的`which` (25认同)
  • 此方法的优点是,只要您知道其原始名称,就不必担心列的位置.我认为这是首选方法,因为您可能 - 稍后 - 更改代码以更改要重命名的列的位置. (9认同)
  • 谢谢.我认为这对R来说有点烦人:如果你不想使用索引号而是旧名称,为什么更改列名是如此困难:( (7认同)
  • 还可以使用 data.table::setnames(dataframe,'旧','新')` (2认同)

Jos*_*ich 75

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

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works
Run Code Online (Sandbox Code Playgroud)

此外,您不需要paste("premium")(调用paste是多余的)并且最好放置空格<-以避免混淆(例如x <- -10; if(x<-3) "hi" else "bye"; x).


Jam*_*mie 48

你试过了吗:

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


Sco*_*son 36

新建议的方法是使用该setNames功能.见 ?setNames.由于这会创建一个新的副本data.frame,请务必将结果分配给原始文件data.frame,如果这是您的意图.

data_frame <- setNames(data_frame, c("premium","change","newprice"))
Run Code Online (Sandbox Code Playgroud)

如果您使用colnames早期答案建议的某些方式,则较新版本的R会向您发出警告.

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

setnames(data_table, "old-name", "new-name")
Run Code Online (Sandbox Code Playgroud)

  • @ Helix123解决方案也适用于data.frame (3认同)
  • 认为它被要求data.frame,而不是data.table (2认同)

Des*_*gos 32

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

names(data)[names(data) == "oldVariableName"] <- "newVariableName"
Run Code Online (Sandbox Code Playgroud)

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

names(data)查看dataframe中的所有名称(data)

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


Ada*_*son 17

与其他人类似:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Run Code Online (Sandbox Code Playgroud)

非常简单易于修改.


小智 16

使用它通过 colname 函数更改列名。

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
Run Code Online (Sandbox Code Playgroud)


dis*_*lus 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
Run Code Online (Sandbox Code Playgroud)

现在你想把"坏"和"最坏"改为"好"和"最好".您可以使用

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")
Run Code Online (Sandbox Code Playgroud)

这导致了

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
Run Code Online (Sandbox Code Playgroud)

  • 该代码假设列名称的顺序等于插入的顺序 (2认同)

nga*_*ita 9

尝试:

names(newprice) <- c("premium", "change", "newprice")
Run Code Online (Sandbox Code Playgroud)


Bay*_*kal 8

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

newprice <- edit(newprice)
Run Code Online (Sandbox Code Playgroud)

并手动更改列名称.


Meh*_*ara 7

我的专栏名称如下

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 
Run Code Online (Sandbox Code Playgroud)

我想更改Class和Sex的列名

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Run Code Online (Sandbox Code Playgroud)


jan*_*cki 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)
Run Code Online (Sandbox Code Playgroud)

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


sbh*_*bha 6

有一对夫妇选择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
Run Code Online (Sandbox Code Playgroud)

还有以下三个范围的变体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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)