Menu

Menambah dan mengubah kolom di R (mutate dan base R)

Cara menambah, mengubah, dan menghapus kolom data frame: df$new <- ..., ifelse() untuk kolom bersyarat, transform(), serta mutate() dari dplyr dengan case_when().

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

Menambah kolom: df$new <- value

Untuk menambah kolom di base R, isi ke nama yang belum ada. Nilainya biasanya dihitung dari kolom-kolom yang sudah ada:

Ada dua hal yang terjadi. orders$total mendapat vector lengkap: price * qty dihitung untuk setiap baris sekaligus, karena aritmetika di R tervektorisasi. orders$currency mendapat satu nilai, yang didaur ulang R ke keempat baris. Panjang lainnya menimbulkan error (replacement has 3 rows, data has 4), cara R melindungimu dari kolom yang tidak sejajar.

Ini berhasil karena data frame adalah list berisi kolom yang sama panjang; mengisi elemen baru bernama akan memperbesar list itu. Dokumentasi data frame menguraikan model tersebut.

Kolom bersyarat: ifelse()

Kolom yang nilainya bergantung pada sebuah kondisi butuh ifelse(), sepupu tervektorisasi dari if. Fungsi ini menerima seluruh vector kondisi dan mengembalikan satu nilai per baris:

Kenapa tidak if biasa? Karena if mengevaluasi tepat satu TRUE/FALSE; kalau diberi satu kolom, ia memunculkan error (the condition has length > 1). ifelse(test, yes, no) memeriksa setiap elemen dan memilih per baris. Untuk tiga kemungkinan hasil atau lebih, kamu bisa menyarangkannya:

Sarang dua tingkat masih wajar; tiga tingkat atau lebih berubah menjadi piramida, dan justru untuk itulah case_when() dari dplyr (lihat di bawah) dibuat. if/else untuk satu nilai dibahas di dokumentasi if-else.

Beberapa kolom sekaligus: transform()

transform() dari base R menambahkan beberapa kolom dalam satu pemanggilan, dengan nama kolom apa adanya:

Perhatikan bahwa transform() mengembalikan data frame baru, jadi kamu harus menugaskan hasilnya kembali, sedangkan df$new <- ... mengubah di tempat. Satu keterbatasan: ekspresi di dalam satu pemanggilan transform() tidak bisa saling melihat, jadi discount = ifelse(total > 50, ...) gagal di sana (total belum ada). Lakukan dalam dua langkah, atau dengan mutate(), yang mengizinkannya.

Mengubah vs membuat

Sintaks penugasan yang sama menimpa kolom yang sudah ada; satu-satunya perbedaan adalah apakah kolom itu sudah ada sebelumnya:

Ini layak direnungkan sejenak: R tidak memberi peringatan apa pun saat kamu menimpa sebuah kolom. Salah ketik seperti df$prise <- round(df$price, 2) diam-diam membuat kolom baru alih-alih memperbaiki yang lama. Setelah mengubah kolom, jalankan print() atau str() pada frame-nya dan pastikan kamu mengubah apa yang memang kamu maksud.

Menghapus kolom

Isi dengan NULL untuk menghapus:

Kolomnya hilang, tanpa basa-basi. Untuk menghapus beberapa kolom, df[, c("a", "b")] (pertahankan yang kamu daftar) biasanya lebih jelas daripada NULL yang diulang-ulang.

Cara dplyr: mutate()

Verb dplyr untuk semua hal di atas adalah mutate(). Potongan kode di bawah ini statis (sandbox ini hanya menjalankan base R), tapi beginilah tampilan operasi yang sama:

library(dplyr)

orders |>
    mutate(
        total    = price * qty,
        big      = total > 50        # can use total, defined one line up
    )

Ada dua kelebihan dibandingkan base R. Pertama, kolom yang didefinisikan di mutate() yang sama bisa saling merujuk, sesuai urutan; hal yang ditolak transform(). Kedua, helper bersyaratnya lebih baik daripada ifelse() bersarang:

students |>
    mutate(
        grade = if_else(score >= 60, "pass", "fail"),
        band  = case_when(
            score >= 85 ~ "high",
            score >= 60 ~ "mid",
            .default    = "low"
        )
    )

if_else() adalah ifelse() yang lebih ketat (kedua cabang harus bertipe sama, sehingga bisa menangkap bug sungguhan). case_when() terbaca sebagai daftar datar pasangan condition ~ value yang diperiksa dari atas ke bawah, dengan .default sebagai cadangan, pengganti yang mudah dibaca untuk piramida ifelse(). Seperti setiap verb dplyr, mutate() mengembalikan data frame baru; lihat pengantar dplyr untuk cara merangkainya dengan verb lainnya.

Yang kamu bawa pulang

  • df$new <- expression menambahkan kolom; ekspresinya dijalankan untuk setiap baris sekaligus.
  • ifelse(test, yes, no) membuat kolom bersyarat; if biasa tidak bisa.
  • transform() menambahkan beberapa kolom per pemanggilan, tapi kolom-kolom itu tidak bisa saling melihat; mutate() bisa.
  • Penugasan yang sama menimpa diam-diam; periksa ejaanmu setelah mengubah kolom.
  • df$col <- NULL menghapus kolom; case_when() menggantikan piramida ifelse() bersarang.

Berikutnya: mengganti nama kolom dengan names(), idiom base R yang andal, dan rename() dari dplyr.

Pertanyaan yang sering diajukan

Bagaimana cara menambahkan kolom baru ke data frame di R?

Isi ke nama kolom yang belum ada: df$total <- df$price * df$qty. R langsung membuat kolomnya saat itu juga. Nilainya bisa berupa satu nilai (didaur ulang ke setiap baris) atau vector yang dihitung dari kolom lain, selama panjangnya sama dengan jumlah baris.

Bagaimana cara membuat kolom bersyarat di R?

Pakai ifelse() yang tervektorisasi: df$grade <- ifelse(df$score >= 60, "pass", "fail") memeriksa setiap baris sekaligus. Jangan pakai if biasa, karena ia hanya menangani satu kondisi, bukan satu kolom. Untuk lebih dari dua kemungkinan hasil, sarangkan pemanggilan ifelse() atau pakai case_when() dari dplyr.

Apa fungsi mutate() di R?

mutate() adalah verb dplyr untuk menambah atau mengubah kolom: df |> mutate(total = price * qty) mengembalikan salinan data frame dengan kolom baru itu. Fungsi ini bisa mendefinisikan beberapa kolom dalam satu pemanggilan, dan kolom yang belakangan bisa memakai kolom sebelumnya yang didefinisikan di mutate yang sama.

Bagaimana cara menghapus kolom dari data frame di R?

Isi kolom itu dengan NULL: df$notes <- NULL langsung menghapus kolomnya. Di dplyr, select(-notes) mengembalikan salinan tanpa kolom itu.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai