Menu

Cara Mengganti Nama Kolom di R (names, colnames, dplyr rename)

Mengganti nama kolom data frame di R: names() dan colnames(), mengganti nama berdasarkan posisi vs nama, setNames(), rename() dari dplyr, dan merapikan header impor yang berantakan.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Lihat Namanya Dulu: names() dan colnames()

Nama kolom tersimpan di sebuah atribut yang bisa kamu baca seperti vector apa pun. names() dan colnames() sama-sama mengembalikannya untuk data frame:

Jawabannya sama. Satu-satunya perbedaan nyata: colnames() juga bekerja pada matriks, sedangkan names() tidak, jadi kode generik memakai colnames(). Untuk data frame sehari-hari, keduanya bisa saling menggantikan.

Kunci untuk semua yang dibahas di bawah: mengganti nama kolom berarti melakukan assignment ke vector ini. Tidak ada fungsi dasar khusus; kamu mengubah names(df) dengan pengindeksan yang sama seperti pada vector mana pun.

Ganti Nama Berdasarkan Posisi (Berhasil, tetapi Rapuh)

Indeks vector nama berdasarkan posisi lalu lakukan assignment:

Kolom 2 sekarang bernama price. Tidak masalah untuk perbaikan cepat secara interaktif, tetapi jebakan di dalam script. Posisi adalah janji tentang urutan kolom, dan urutan kolom adalah hal yang paling tidak stabil dari data impor: begitu CSV yang kamu baca bertambah satu kolom, names(df)[2] mengganti nama kolom yang salah, tanpa peringatan. Kalau sebuah script mengganti nama berdasarkan posisi, perubahan skema akan merusaknya tanpa pesan error.

Ganti Nama Berdasarkan Nama (Idiom Dasar yang Andal)

Cocokkan nama lamanya alih-alih memercayai posisi:

Baca bagian dalamnya lebih dulu: names(sales) == "prc" menghasilkan FALSE TRUE FALSE, sebuah mask logika atas vector nama. Mengindeks dengannya memilih entri yang cocok, dan assignment-nya menggantinya. Kalau "prc" tidak ada, tidak ada yang cocok dan tidak ada yang berubah (tanpa error, jadi periksa hasilnya). Idiom ini tahan terhadap perubahan urutan, kolom tambahan, dan salin-tempel ke script lain. Hafalkan; inilah jawaban R dasar untuk "mengganti nama kolom".

Beberapa Sekaligus

Ganti seluruh vector ketika kamu menamai setiap kolom (umum tepat setelah impor), atau pakai match() untuk mengganti nama sebagian kolom pilihan:

match(old, names(df)) mengembalikan posisi nama-nama lama, sehingga nama baru mendarat tepat di tempat nama lama berada, aman terhadap urutan seperti idiom satu nama. Kalau ada nama lama yang tidak ditemukan, match() mengembalikan NA dan assignment-nya menghasilkan error, dan itulah jenis kegagalan yang kamu inginkan: jelas terlihat.

setNames() untuk Pipeline

Semua idiom di atas mengubah sebuah variabel dalam dua langkah. setNames(object, names) mengembalikan salinan yang sudah diganti namanya dalam satu ekspresi, yang dibutuhkan oleh pipeline:

Praktis ketika sebuah fungsi mengembalikan frame tanpa nama atau dengan nama yang buruk dan kamu ingin memperbaikinya langsung di tempat, read_something() |> setNames(c("id", "value")), tanpa variabel sementara.

Cara dplyr: rename() dan rename_with()

rename() dari dplyr menerima pasangan new = old, nama baru lebih dulu, yang pernah terbalik bagi semua orang (statis; sandbox hanya menjalankan R dasar):

library(dplyr)

sales |> rename(price = prc, qty = q)

Nama lama yang tidak disentuh oleh panggilan itu tetap apa adanya, dan nama lama yang salah ketik menghasilkan error, bukan diam-diam tidak melakukan apa-apa, peningkatan nyata dibandingkan idiom dasar. Untuk mengganti nama berdasarkan aturan, bukan per pasangan, rename_with() menerapkan sebuah fungsi ke nama-namanya:

sales |> rename_with(toupper)                          # every column
sales |> rename_with(toupper, starts_with("p"))        # just some

Lihat pengantar dplyr untuk melihat bagaimana keduanya masuk ke keluarga kata kerja.

Merapikan Header Impor yang Berantakan

Header CSV sungguhan datang sebagai "Order ID", "unit.price ($)", "2024 Total": nama dengan spasi dan simbol yang memaksa kamu memakai backtick di mana-mana. make.names() dari R dasar mengubah vector character apa pun menjadi nama R yang valid:

Valid, tetapi jelek dengan caranya sendiri (X2024.Total). Itulah sebabnya banyak tim menstandarkan diri pada clean_names() dari package janitor, yang menghasilkan snake_case yang rapi (order_id, unit_price, x2024_total) dalam satu panggilan: df |> janitor::clean_names(). Kalau kamu mengimpor file berantakan setiap minggu, package ini langsung sepadan.

Yang Perlu Kamu Ingat

  • Nama kolom hanyalah sebuah vector: baca dengan names()/colnames(), ganti nama dengan melakukan assignment ke dalamnya.
  • names(df)[2] <- "new" itu rapuh; names(df)[names(df) == "old"] <- "new" adalah idiom yang perlu dihafal.
  • match() mengganti nama beberapa kolom berdasarkan nama; setNames() mengganti nama langsung di dalam pipeline.
  • rename(new = old) dari dplyr menghasilkan error untuk nama yang tidak ada (bagus), dan rename_with() mengganti nama berdasarkan aturan.
  • Untuk header impor yang berantakan: make.names() di R dasar, janitor::clean_names() untuk hasil yang rapi.

Berikutnya: pengurutan, yaitu sort() untuk vector, trik order() untuk data frame, dan arrange().

Pertanyaan yang sering diajukan

Bagaimana cara mengganti nama kolom di R?

Idiom dasar yang paling andal adalah mencocokkan berdasarkan nama: names(df)[names(df) == "old"] <- "new". Kode ini menemukan kolom bernama old di mana pun posisinya dan mengganti namanya. Di dplyr caranya rename(df, new = old); perhatikan urutannya: nama baru lebih dulu.

Apa bedanya names() dan colnames()?

Pada data frame, secara praktis tidak ada: keduanya membaca dan mengatur nama kolom. colnames() juga bekerja pada matriks (sedangkan names() tidak), jadi kode yang dimaksudkan untuk menangani keduanya cenderung memakai colnames(). Pada data frame biasa, pakai yang mana saja yang kamu suka.

Bagaimana cara mengganti nama kolom berdasarkan posisi di R?

Lakukan assignment ke vector nama pada posisi itu: names(df)[2] <- "price" mengganti nama kolom kedua. Cara ini berhasil, tetapi rapuh: begitu ada kolom yang ditambahkan atau CSV-nya mengubah urutan kolom, posisi 2 menjadi kolom yang lain. Lebih baik ganti nama berdasarkan nama.

Bagaimana cara mengganti nama beberapa kolom sekaligus di R?

Lakukan assignment dengan vector lengkap: names(df) <- c("id", "name", "price") mengganti semua nama secara berurutan. Untuk mengganti nama beberapa kolom pilihan berdasarkan nama, pakai match(): names(df)[match(c("old1", "old2"), names(df))] <- c("new1", "new2"). Di dplyr: rename(df, new1 = old1, new2 = old2).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai