Mengubah nama kolom dari bingkai data

399

Saya memiliki kerangka data yang disebut "harga baru" (lihat di bawah) dan saya ingin mengubah nama kolom dalam program saya di R.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

Sebenarnya inilah yang saya lakukan:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Saya belum menempatkan ini dalam satu lingkaran karena saya ingin setiap nama kolom berbeda seperti yang Anda lihat.

Ketika saya menempelkan program saya ke konsol R ini adalah output yang diberikannya kepada saya:

> 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(“"

Saya telah sama-sama mencoba menggunakan c()fungsi-misalnya c("premium"), bukan paste()fungsi, tetapi tidak berhasil.

Bisakah seseorang membantu saya untuk mencari tahu?

Putra
sumber
Jika jawaban Dirk berhasil maka masalahnya adalah Anda bekerja dengan matriks dan bukan dengan kerangka data. Anda dapat memeriksa ini dengan is.matrixatau str.
IRTFM
3
Lihat jawaban ini di dplyr :: rename stackoverflow.com/a/26146202/1831980
Rasmus Larsen
8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen
Kesalahan Anda tidak ada hubungannya dengan kualitas kode Anda. Anda hanya menggunakan simbol yang salah. Ini "tidak dikenali oleh R, gunakan" sebagai gantinya. Saya tahu mereka mungkin terlihat sama. Lihat dekat: "". Itu dia.
Edo

Jawaban:

595

Gunakan colnames()fungsinya:

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

Anda juga dapat mengatur ulang:

R> colnames(X)[2] <- "superduper"
Dirk Eddelbuettel
sumber
12
@ Gang Mengapa tidak menggunakan nama () alih-alih colnames ()?
Antoine Lizée
4
Bagus! Anda juga dapat mengelompokkan beberapa kolom sekaligus (berguna untuk bingkai data besar). colnames(X)[c(1,2)] <- c("good", "better")
metakermit
7
Coba setnames()di data.tablepaket. Gunakan sesuatu seperti setnames(DT,"b","B")atausetnames(DT,c("a","E"),c("A","F"))
dwstu
Anehnya, setelah mengatur nama kolom dari frame data q1, mencoba untuk bermutasi menggunakan frame data dplyrseperti dalam q1 <- q1 %>% mutate(rel_count = count / 482462)hasil kesalahan Error in mutate_impl(.data, dots) : unknown column 'days'(di mana daysnama baru diberikan ke kolom). Ini benar-benar membuat frustrasi.
David Tonhofer
176

Saya menggunakan ini:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Matheus Abreu
sumber
7
Terima kasih. Saya pikir ini agak menjengkelkan dengan R: Mengapa begitu sulit untuk mengubah nama kolom jika Anda tidak ingin menggunakan nomor indeks tetapi nama lama :(
Arne
10
Metode ini memiliki keuntungan bahwa Anda tidak perlu khawatir tentang posisi kolom, asalkan Anda tahu nama aslinya. Saya pikir ini adalah metode yang disukai karena Anda mungkin - nanti - membuat perubahan pada kode yang mengubah posisi kolom yang ingin Anda ganti namanya.
Paulo S. Abreu
78

Kesalahan ini disebabkan oleh "kutipan pintar" (atau apa pun namanya). Pelajaran di sini adalah, "jangan menulis kode Anda di 'editor' yang mengubah kutipan menjadi kutipan pintar".

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

Selain itu, Anda tidak perlu paste("premium")(panggilan ke pasteredundan) dan merupakan ide bagus untuk meletakkan spasi di sekitar <-untuk menghindari kebingungan (mis x <- -10; if(x<-3) "hi" else "bye"; x.).

Joshua Ulrich
sumber
51

Apakah Anda sudah mencoba:

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

?

Jamie
sumber
42

Cara baru yang disarankan untuk melakukan ini adalah dengan menggunakan setNamesfungsi. Lihat ?setNames. Karena ini membuat salinan baru dari data.frame, pastikan untuk menetapkan hasilnya ke aslinya data.frame, jika itu niat Anda.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Versi R yang lebih baru akan memberi Anda peringatan jika Anda menggunakannya colnames beberapa cara yang disarankan oleh jawaban sebelumnya.

Jika ini data.tablebukan, Anda bisa menggunakan data.tablefungsi setnames, yang dapat mengubah nama kolom tertentu atau nama kolom tunggal dengan referensi :

setnames(data_table, "old-name", "new-name")
Scott C Wilson
sumber
2
pikir itu diminta untuk data.frame, bukan data.table
Helix123
35

Saya memiliki masalah yang sama dan kode ini berhasil untuk saya.

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

Singkatnya, kode ini melakukan hal berikut:

names(data)melihat ke semua nama dalam kerangka data ( data)

[names(data) == oldVariableName]ekstrak nama variabel ( oldVariableName) yang ingin Anda <- "newVariableName"beri nama baru dan tetapkan nama variabel yang baru.

Desta Haileselassie Hagos
sumber
bagaimana ini bekerja jika Anda memiliki vektor misalnya 3 oldVariableNames?
jiggunjer
Persis apa yang saya cari -> 2 jempol !!
SilSur
19

Mirip dengan yang lain:

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

Cukup sederhana dan mudah dimodifikasi.

Adam Erickson
sumber
10

mencoba:

names(newprice) <- c("premium", "change", "newprice")
ngamita
sumber
10

Jika Anda perlu mengganti nama tidak semua kecuali beberapa kolom sekaligus ketika Anda hanya tahu nama kolom lama, Anda dapat menggunakan colnamesfungsi dan %in%operator. Contoh:

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

Sekarang Anda ingin mengubah "buruk" dan "terburuk" menjadi "baik" dan "terbaik". Kamu bisa menggunakan

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Ini menghasilkan

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
disiplin
sumber
1
Kode itu mengasumsikan urutan nama kolom Anda sama dengan urutan sisipan
Hillary Sanders
10

Gunakan ini untuk mengubah nama kolom dengan fungsi colname.

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

Anda dapat melakukan pengeditan dengan:

newprice <- edit(newprice)

dan ubah nama kolom secara manual.

Baykal
sumber
Bukankah ini hanya berfungsi untuk elemen vektor dan faktor? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond
Paling tidak berfungsi untuk frame data. Itu yang saya tahu.
Baykal
7

Nama kolom saya adalah seperti di bawah ini

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

Saya ingin mengubah nama kolom Kelas dan Jenis Kelamin

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Mehul Katara
sumber
7

Ada beberapa opsi dengan dplyr::rename()dan 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

Ada juga tiga varian cakupan dplyr::rename(): dplyr::rename_all()untuk semua nama kolom, dplyr::rename_if()untuk penargetan nama kolom, dan dplyr::rename_at()untuk kolom bernama terpilih. Contoh berikut menggantikan spasi dan titik dengan garis bawah dan mengubah semuanya menjadi huruf kecil:

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() dapat juga digunakan dengan cara yang serupa:

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
sbha
sumber
6

Hanya untuk memperbaiki dan sedikit memperluas jawaban Scott Wilson.
Anda dapat menggunakan data.tablesetnames fungsi data.table pada data.frame juga.

Jangan berharap mempercepat operasi tetapi Anda dapat mengharapkannya setnamesmenjadi lebih efisien untuk konsumsi memori karena memperbarui nama kolom dengan referensi. Ini bisa dilacak dengan addressfungsinya, lihat di bawah.

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)

Jadi jika Anda menekan batas memori Anda, Anda dapat mempertimbangkan untuk menggunakan yang ini sebagai gantinya.

jangorecki
sumber
3

Ini mungkin bermanfaat:

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'))
Chris
sumber
1

Jika kita memiliki 2 dataframe, karya-karya berikut

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

Kami mengubah nama DF1 sebagai berikut

 colnames(DF1)<- colnames(DF2)
Raghavan vmvs
sumber