Bagaimana cara mengganti nama satu kolom dalam data.frame?


335

Saya tahu jika saya memiliki bingkai data dengan lebih dari 1 kolom, saya dapat menggunakannya

colnames(x) <- c("col1","col2")

untuk mengganti nama kolom. Bagaimana saya melakukan ini jika hanya satu kolom? Berarti bingkai vektor atau data dengan hanya satu kolom di dalamnya.

Contoh:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
Solusi @ aix akan bekerja untuk data.frame 1 kolom. Anda mungkin bingung oleh drop=TRUEargumen default [, yang menyebabkan objek "1-kolom" dikonversi menjadi vektor ... dan vektor tidak memilikinya colnames. Contoh dari apa yang Anda coba akan sangat membantu.
Joshua Ulrich

2
ini berfungsi jika Anda menggunakan "colnames (x) [1] <- 'newname2'"
screechOwl

Jawaban:


345
colnames(trSamp)[2] <- "newname2"

mencoba mengatur nama kolom kedua. Objek Anda hanya memiliki satu kolom, jadi perintahnya membuat kesalahan. Ini harus cukup:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Ini sepertinya tidak berfungsi jika nama kolomnya seperti di "A,B,C,X,Y,Z"mana saya ingin mengganti namanya untuk Ydigunakan testData[379] <- "Y".
Chetan Arvind Patil

576

Ini adalah cara umum di mana Anda tidak harus mengingat lokasi variabel yang tepat:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Kode ini cukup banyak melakukan hal berikut:

  1. names(df) melihat ke semua nama di df
  2. [names(df) == old.var.name] ekstrak nama variabel yang ingin Anda periksa
  3. <- 'new.var.name' menetapkan nama variabel baru.

5
Saya juga cukup baru dengan R, menyukai solusi ini! Saya sudah benar-benar memeriksa apa fungsinya, dan saya pikir itu layak menentukan yang [names(df) == old.var.name]benar - benar mengembalikan vektor dengan nilai true / false. Jadi berpotensi mengubah beberapa nama kolom jika, misalnya, ekspresi reguler digunakan.
mikyatope

3
Untuk hasil ekspresi reguler, gunakan sesuatu seperti names(df) = sub('pattern', 'replacement', names(df)). Kalau tidak, Anda akan mencoba mengatur beberapa kolom dengan nama yang sama.
We Are All Monica

40
Perasaan campur aduk ... di dunia yang sempurna, tempat banyak bahasa pemrograman yang sempurna, akankah ini benar-benar membutuhkan banyak penekanan tombol untuk mengubah nama satu kolom? Saya suka R tetapi kadang-kadang saya ingin mencekiknya karena alasan-alasan seperti ini.
tumultous_rooster

4
Bagaimana tidak ada fungsi pembungkus untuk ini di pangkalan?
ifly6

1
Bagaimana kita semua berharap! Saya tidak tahu tentang sekarang, tetapi saat itu tidak ada pembungkus di pangkalan
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
Saya suka solusi ini karena Anda dapat mereferensikan nama kolom dengan nama, sebagai lawan dari keharusan untuk mengetahui kolom nomor mana itu. Lebih baik untuk fitur jumlah yang lebih besar.
Cybernetic

1
Saya punya sedikit ekstensi untuk pertanyaan dan jawaban ini. Saya memiliki kerangka data dengan kolom yang memiliki huruf 'snp' di dalamnya. Saya ingin mengubah nama menjadi 'Penanda' . Tetapi saya ingin menggunakan ekspresi reguler untuk melakukannya. Ternyata kode yang saya miliki cacat:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"karena kolom tersebut tidak diganti nama. Jika saya melakukan names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"hal itu adalah nama. Apa yang saya lewatkan?
Sander W. van der Laan

76

Ini adalah pertanyaan lama, tetapi perlu dicatat bahwa sekarang Anda dapat menggunakan setnamesdari data.tablepaket.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
atau setNamesdari pangkalan R.
PatrickT

53

Ini juga dapat dilakukan dengan menggunakan plyrpaket Hadley , dan renamefungsinya.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

Anda dapat mengganti nama berdasarkan nama (tanpa mengetahui posisi) dan melakukan beberapa penggantian nama sekaligus. Setelah melakukan penggabungan, misalnya, Anda mungkin berakhir dengan:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Yang kemudian bisa Anda ganti namanya dalam satu langkah menggunakan:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renamesekarang menjadi fungsi dalam dplyrpaket juga.
Sam Firke

36

Saya pikir cara terbaik untuk mengganti nama kolom adalah dengan menggunakan paket dplyr seperti ini:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Ini berfungsi sama untuk mengganti nama satu atau banyak kolom dalam dataset apa pun.


12

Saya suka gaya berikutnya untuk mengganti nama nama kolom dataframe satu per satu.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

dimana

which(colnames(df) == 'old_colname')

kembali dengan indeks kolom tertentu.


1
+1 untuk memberi pengguna kesempatan untuk menggunakan nama lama yang sebenarnya :)

1
Apa perbedaan di sini dibandingkan dengan solusi @zongshiwujie?
buhtz

which()tidak perlu.
sindri_baldur

12

Saya menemukan bahwa cara paling mudah untuk mengubah nama satu kolom menggunakan dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • bekerja dengan baik di rantai pipa
  • nyaman ketika nama disimpan dalam variabel
  • bekerja dengan nama atau indeks kolom
  • jelas dan kompak

6

Anda dapat menggunakan rename.varsdalam gdatapaket.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Ini sangat berguna di mana Anda memiliki lebih dari satu nama variabel untuk diubah atau Anda ingin menambahkan atau menunggu beberapa teks ke nama variabel, maka Anda dapat melakukan sesuatu seperti:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Untuk contoh menambahkan teks ke subset nama variabel, lihat: https://stackoverflow.com/a/28870000/180892


Ini yang termudah, terima kasih. Punya masalah dengan paket dplyr.
DannyB

4

Mencoba:

colnames(x)[2] <- 'newname2'

8
Inilah yang menyebabkan kesalahan yang ditanyakan OP (dalam editannya). Ini tidak akan berfungsi, karena kerangka data hanya memiliki satu kolom.

@ NPE - Ini sepertinya tidak berfungsi jika nama kolomnya seperti di "A,B,C,X,Y,Z"mana saya ingin mengganti namanya untuk Ydigunakan testData[379] <- "Y".
Chetan Arvind Patil

4

Ini mungkin sudah ada di luar sana, tetapi saya bermain dengan mengganti nama bidang sambil mencari solusi dan mencoba ini sambil lalu. Bekerja untuk tujuan saya.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

Edit dimulai di sini ....

Ini juga berfungsi.

df <- rename(df, c("oldColName" = "newColName"))

Bagi siapa pun yang menandai saya, itu baik-baik saja, tetapi karena saya jelas baru melakukan hal ini, mungkin Anda bisa mengetahui apa yang salah dengan jawabannya.
Scottieie

Tidak ada yang salah dengan jawaban Anda, selain itu tidak menjadi oneliner .. itu hanya pengguna SO yang bermusuhan tidak memiliki keberanian untuk membenarkan kemarahannya.
Hitung0

Terima kasih @ count0. Sebenarnya bermakna memiliki poin mana atau apa pun untuk mengomentari pertanyaan, sesuatu yang belum bisa saya lakukan. Pertanyaan-pertanyaan lanjutan dalam beberapa kasus akan lebih baik ketika saya mempelajari keterampilan baru. Lagi. TY.
Scottieie

1
kita perlu memberikan semua nama kolom untuk menggunakan ini.
Arpit Sisodia

dari paket mana renamefungsi itu berasal?
Diego

3

Jika Anda tahu bahwa kerangka data Anda hanya memiliki satu kolom, Anda dapat menggunakan: names(trSamp) <- "newname2"


3

Anda juga dapat mencoba 'upData' dari paket 'Hmisc'.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


Sangat bagus! Dimungkinkan juga untuk mengganti nama lebih banyak kolom sekaligus: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' Ubah namaThisColumn '))
FraNut

0

Pertanyaan OP telah dijawab dengan baik dan benar-benar. Namun, inilah trik yang mungkin berguna dalam beberapa situasi: pencocokan sebagian dari nama kolom, terlepas dari posisinya dalam kerangka data:

Pencocokan sebagian pada nama:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Contoh lain: pencocokan sebagian pada kehadiran "tanda baca":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Ini adalah contoh yang harus saya tangani hari ini, saya pikir mungkin layak untuk dibagikan.



0

Kita dapat menggunakan rename_withuntuk mengganti nama kolom dengan fungsi ( stringrfungsi, misalnya).

Pertimbangkan data berikut df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Ganti nama semua variabel dengan dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Rename dengan nama partikel dengan beberapa dplyrkata kerja ( starts_with, ends_with, contains, matches, ...).

Contoh dengan .( xvariabel):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Ubah nama oleh kelas dengan banyak fungsi dari tes kelas, seperti is.integer, is.numeric, is.factor...

Contoh dengan is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

Peringatan:

Pesan peringatan: 1: Dalam stri_replace_first_regex (string, pola, fix_replacement (penggantian),: panjang objek yang lebih panjang bukan kelipatan dari panjang objek yang lebih pendek 2: Dalam nama [cols] <- .fn (nama [cols], ...) : jumlah item yang akan diganti bukan kelipatan dari panjang penggantian

Itu tidak relevan, karena itu hanya ketidakkonsistenan seq_along(.)dengan fungsi ganti.


-1

Saya hanya akan menambahkan kolom baru ke bingkai data dengan nama yang saya inginkan dan mendapatkan data untuknya dari kolom yang ada. seperti ini:

dataf$value=dataf$Article1Order

maka saya menghapus kolom lama! seperti ini:

dataf$Article1Order<-NULL

Kode ini mungkin tampak konyol! Tapi itu bekerja dengan sempurna ...


-1

Saya hanya akan mengubah nama kolom ke dataset dengan nama baru yang saya inginkan dengan kode berikut: nama (dataset) [index_value] <- "new_col_name"


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.