Daftar dalam Pemrograman R: Cara Membuat & Memilih Elemen

โšก Ringkasan Cerdas

R List adalah objek yang menyimpan vektor, matriks, data frame, dan bahkan daftar lainnya dalam satu wadah. Fungsi list() membangunnya, dan tanda kurung siku ganda mengambil kembali elemen apa pun.

  • ๐Ÿงบ Penyimpanan Campuran: Sebuah list dapat menyimpan objek dengan tipe dan panjang yang berbeda, sesuatu yang tidak dapat dilakukan oleh vektor biasa.
  • ๏ธ Langkah Pembuatan: list(vect, mat, df) menggabungkan vektor, matriks, dan data frame ke dalam satu objek.
  • ๐Ÿ”ข Akses Posisi: my_list[[2]] mengembalikan elemen itu sendiri, sedangkan my_list[2] mengembalikan daftar yang berisi satu elemen.
  • ๏ธ Elemen yang Dinamai: Pemberian tag pada elemen saat pembuatan memungkinkan akses melalui operator $ atau [[โ€œnamaโ€]].
  • ๏ธ Pengeditan Langsung di Tempat: Penugasan ulang memperbarui sebuah elemen, dan penugasan NULL menghapusnya dari daftar.
  • ๐Ÿ”— Perataan: unlist() menggabungkan daftar bersarang menjadi satu vektor atomik untuk analisis selanjutnya.

Membuat Daftar di R dengan Pemrograman dan Memilih Elemen

Apa itu Daftar R?

Daftar R adalah objek dalam pemrograman R yang mencakup matriks, vektor, bingkai data, atau daftar di dalamnya. R List juga digunakan untuk menyimpan kumpulan objek dan menggunakannya saat kita membutuhkannya. Kita bisa membayangkan daftar R sebagai tas untuk menaruh banyak barang berbeda. Ketika kita perlu menggunakan suatu barang, kita bisa membuka tasnya dan menggunakannya.

Perbedaan dengan vektor inilah yang membuat daftar (list) berguna. Vektor memaksa setiap elemen menjadi satu tipe, sehingga menempatkan kata di samping angka mengubah angka tersebut menjadi teks. Daftar tidak menerapkan aturan seperti itu, itulah sebabnya daftar dapat memuat vektor lima elemen, atau daftar dua baris. matriks dan sebuah data frame berisi 714 baris berdampingan tanpa mengubah satu pun di antaranya.

Sintaks Daftar di R

Kita dapat menggunakan fungsi list() untuk membuat daftar dalam pemrograman R:

list(element_1, ...)
arguments:
-element_1: store any type of R object
-...: pass as many objects as specifying. each object needs to be separated by a comma

Setiap argumen dapat diberikan secara langsung atau dalam bentuk tertentu. tag = nilaiArgumen kosong menjadi elemen posisional yang hanya dapat dijangkau berdasarkan nomornya, sedangkan argumen berlabel juga mendapatkan nama. Referensi dasar R untuk daftar() Dokumen ini menjelaskan kedua bentuk tersebut dan mencatat bahwa unlist() bertindak sebagai kebalikan perkiraan dari as.list().

Cara Membuat Daftar di R

Di bawah ini adalah proses langkah demi langkah tentang cara membuat daftar di R:

Pada contoh di bawah ini, kita akan membuat tiga objek berbeda, sebuah Vektor, sebuah Matriks dan a Bingkai Data menggunakan fungsi daftar di R.

Langkah 1) Buat Vektor

Gunakan kode di bawah ini untuk membuat vektor di R

# Vector with numeric from 1 up to 5
vect  <- 1:5

Operator titik dua (:) membangun urutan 1, 2, 3, 4, 5 sebagai vektor bilangan bulat, dan tanda panah penugasan (:) menyimpannya dengan nama vect.

Langkah 2) Buat Matriks

Sekarang, buat matriks menggunakan kode berikut.

# A 2x 5 matrix
mat  <- matrix(1:9, ncol = 5)
dim(mat)

Ada dua detail yang perlu diperhatikan di sini. Sebuah grid dengan dua baris dan lima kolom membutuhkan sepuluh nilai, namun hanya sembilan yang diberikan, sehingga R mendaur ulang urutan tersebut dan mencetak peringatan bahwa panjang data bukan kelipatan dari jumlah baris. Nilai yang didaur ulang itulah yang menyebabkan baris kedua matriks yang dicetak berakhiran 1, bukan 10. Panggilan ke dim() kemudian melaporkan bentuknya.

Keluaran:

## [1] 2 5

Langkah 3) Buat Bingkai Data

Buat bingkai data di R menggunakan kode di bawah ini

# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]

Komentar tersebut menyebutkan baris kesepuluh, tetapi ekspresi tersebut mempertahankan baris 1 hingga 10 dari seri EuStockMarkets bawaan. Subsetting juga menghilangkan kelas time-series, sehingga yang dikembalikan adalah matriks numerik dan bukan data frame yang sebenarnya, itulah sebabnya hasil cetak di bawah ini memiliki label baris bergaya [1,] dan bukan nama baris. Bungkus panggilan tersebut dengan as.data.frame() setiap kali data frame yang sebenarnya dibutuhkan.

Langkah 4) Buat Daftar di R

Sekarang, kita dapat memasukkan ketiga objek tersebut ke dalam daftar R menggunakan kode di bawah ini

# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list

Keluaran:

## [[1]]
## [1] 1 2 3 4 5

## [[2]]
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

## [[3]]
##          DAX    SMI    CAC   FTSE
##  [1,] 1628.75 1678.1 1772.8 2443.6
##  [2,] 1613.63 1688.5 1750.5 2460.2
##  [3,] 1606.51 1678.6 1718.0 2448.2
##  [4,] 1621.04 1684.1 1708.1 2470.4
##  [5,] 1618.16 1686.6 1723.1 2484.7
##  [6,] 1610.61 1671.6 1714.3 2466.8
##  [7,] 1630.75 1682.9 1734.5 2487.9
##  [8,] 1640.17 1703.6 1757.4 2508.4
##  [9,] 1635.47 1697.5 1754.0 2510.5
##  [10,] 1645.89 1716.3 1754.3 2497.4

Tiga header tanda kurung ganda dalam output tersebut adalah posisi daftar. Tidak ada yang diratakan atau diubah: elemen pertama masih berupa vektor bilangan bulat, elemen kedua masih berupa matriks, dan elemen ketiga masih berisi kesepuluh baris harga saham.

Pilih Elemen dari Daftar R

Setelah kita membuat daftar, kita dapat mengaksesnya dengan cukup mudah. โ€‹โ€‹Kita perlu menggunakan [[indeks]] untuk memilih elemen dalam daftar. Nilai di dalam tanda kurung siku ganda mewakili posisi item dalam daftar yang ingin kita akses.tracMisalnya, jika kita memasukkan angka 2 di dalam tanda kurung, R akan mengembalikan elemen kedua yang tercantum.

Sekarang dalam hal ini R tutorial, mari kita coba pilih item kedua dari daftar di R bernama my_list, kita menggunakan my_list[[2]]

# Print second element of the list
my_list[[2]]

Keluaran:

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

Tanda kurung tunggal dan ganda tidak dapat saling menggantikan, dan membingungkan keduanya adalah sumber kesalahan daftar yang paling umum. Satu tanda kurung mempertahankan pembungkusnya, dua tanda kurung menghapusnya.

Ekspresi Apa yang kembali Kelas hasil Gunakan saat
daftar saya[[2]] Elemen yang tersimpan itu sendiri Apa pun yang tersimpan, di sini berupa matriks. Anda perlu melakukan perhitungan pada satu elemen.
daftar saya[2] Subdaftar yang memuat satu elemen tersebut daftar Anda perlu menyimpan pembungkus daftar tersebut.
my_list[c(1, 3)] Subdaftar elemen yang dipilih daftar Anda membutuhkan beberapa elemen sekaligus.
daftar saya[-2] Setiap elemen kecuali yang kedua daftar Anda perlu menghapus sebuah elemen.
# Compare the two bracket styles
class(my_list[[2]])   # the matrix itself
class(my_list[2])     # a list of length one

# Several elements, and everything but one element
my_list[c(1, 3)]
my_list[-2]

Daftar Bernama di R

Indeks posisi bersifat rapuh: masukkan satu elemen dan setiap angka setelahnya akan bergeser. Penamaan elemen menghilangkan risiko tersebut dan membuat kode terbaca seperti data yang dijelaskannya. Nama dapat diberikan saat daftar dibuat, atau ditambahkan setelahnya dengan names().

# Tag each element at creation time
named_list <- list(numbers = vect, grid = mat, prices = df)

# Three ways to reach the same element
named_list$grid
named_list[["grid"]]
named_list["grid"]      # returns a one-element list

# Read or replace the names later
names(named_list)
names(named_list)[2] <- "grid_2x5"

Operator $ dan tanda kurung ganda berbeda dalam satu hal yang sering membingungkan pemula. Operator $ melakukan pencocokan sebagian, sehingga named_list$pri masih menemukan harga, sedangkan named_list[[โ€œpriโ€]] mengembalikan NULL karena tanda kurung ganda cocok persis kecuali jika exact = FALSE diberikan. Pencocokan sebagian nyaman di konsol dan tidak aman dalam skrip, jadi lebih baik gunakan bentuk yang tepat dalam kode yang disimpan.

# A compact map of the whole structure
str(named_list)

Fungsi str() mencetak satu baris per elemen beserta tipe dan ukurannya, yang merupakan cara tercepat untuk memastikan bahwa sebuah daftar berisi apa yang Anda harapkan sebelum mengakses indeksnya.

Memodifikasi, Menambah, dan Menghapus Elemen dalam Daftar R

Sebuah daftar tidak tetap setelah dibuat. Aksesor yang sama yang membaca elemen juga menulis ke elemen tersebut, sehingga memperbarui, memperluas, dan memperkecil daftar semuanya menggunakan penugasan biasa.

# Replace an element in place
named_list[["numbers"]] <- 1:10

# Add a new element simply by naming it
named_list[["created"]] <- Sys.Date()

# Append without a name: the element lands at the end
named_list <- append(named_list, list(TRUE))

# Delete an element by assigning NULL to it
named_list[["created"]] <- NULL
  • Menggantikan: Memberikan nilai pada nama yang sudah ada akan menimpa elemen tersebut dan membiarkan posisinya tidak berubah.
  • Tambahkan: Memberikan nilai pada nama yang tidak ada akan menambahkan elemen baru di akhir daftar.
  • Menambahkan: Fungsi append() menerima daftar sebagai argumen kedua, jadi bungkus nilai mentah dengan list() sebelum meneruskannya.
  • Menghapus: Memberikan nilai NULL dengan tanda kurung ganda akan menghapus elemen dan memperpendek daftar.

Salah satu konsekuensi yang sering membuat orang bingung adalah: karena NULL berarti penghapusan, Anda tidak dapat menyimpan NULL yang sebenarnya dengan tanda kurung ganda. Gunakan penugasan tanda kurung tunggal sebagai gantinya, seperti pada named_list[โ€œemptyโ€] <- list(NULL), yang mempertahankan slot dan menempatkan NULL di dalamnya.

Daftar Bersarang dan unlist() di R

Karena sebuah list dapat memuat objek R apa pun, maka list tersebut juga dapat memuat list lain. Nesting adalah cara objek konfigurasi, respons JSON, dan hasil model biasanya direpresentasikan di R, sehingga mengakses list bersarang dan meratakan list tersebut adalah tugas sehari-hari.

# A list whose elements are themselves lists
project <- list(
  meta = list(owner = "analyst", year = 2026),
  data = list(vect, mat)
)

# Chain the accessors to reach an inner value
project$meta$year
project[["data"]][[2]]

# Flatten every level into one atomic vector
flat <- unlist(project)

# Strip a single level and keep the rest as a list
half <- unlist(project, recursive = FALSE)

Perataan memiliki biaya yang perlu dipahami. `unlist()` harus mengembalikan satu vektor atomik, sehingga ia mengubah setiap nilai ke tipe paling umum yang ada, mengikuti urutan logis, integer, double, karakter. Oleh karena itu, daftar bersarang yang mencampur angka dengan teks akan dikembalikan seluruhnya sebagai teks. Nama hasil dibangun dengan menggabungkan tag luar dan dalam, itulah sebabnya sebuah elemen muncul sebagai `meta.owner` dan bukan `owner`.

Lewatkan `use.names = FALSE` ketika nama gabungan tersebut tidak diinginkan, dan atur `recursive = FALSE` ketika hanya lapisan terluar yang harus dihapus. Jika nilai-nilai tersebut harus mempertahankan tipenya, biarkan struktur tetap utuh dan kerjakan seluruh daftar alih-alih meratakannya.

Bingkai Data Bawaan di R

Daftar sering kali diisi dengan data yang dibaca dari disk atau dari web, jadi akan sangat membantu untuk melihat bagaimana sebuah data frame terbentuk sebelum disimpan di dalamnya. Sebelum membuat data frame kita sendiri, kita dapat melihat dataset R yang tersedia secara online. Dataset penjara memiliki dimensi 714ร—5. Kita dapat melihat sekilas bagian bawah data frame dengan fungsi tail(). Secara analogi, head() menampilkan bagian atas data frame. Anda dapat menentukan jumlah baris yang ditampilkan dengan head(df, 5). Kita akan mempelajari lebih lanjut tentang fungsi read.csv() di bagian selanjutnya. mengimpor data di R tutorial.

PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)

Keluaran:

##   X state year govelec black
## 1 1     1   80       0 0.2560
## 2 2     1   81       0 0.2557
## 3 3     1   82       1 0.2554
## 4 4     1   83       0 0.2551
## 5 5     1   84       0 0.2548

[1:5] yang mengikuti read.csv() memilih lima kolom pertama, bukan lima baris pertama, karena data frame itu sendiri adalah daftar kolom. Pengindeksan tanda kurung tunggal pada daftar mengembalikan daftar yang lebih kecil, dan di sini daftar yang lebih kecil itu masih berupa data frame.

Kita dapat memeriksa struktur bingkai data dengan str:

# Structure of the data
str(df)

Keluaran:

## 'data.frame':    714 obs. of  5 variables:
##  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ state  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year   : int  80 81 82 83 84 85 86 87 88 89 ...
##  $ govelec: int  0 0 1 0 0 0 1 0 0 0 ...
##  $ black  : num  0.256 0.256 0.255 0.255 0.255 ...

Semua variabel disimpan di numerik format. Awalan $ pada setiap baris adalah operator yang sama yang digunakan pada daftar bernama sebelumnya, yang menegaskan bahwa data frame adalah daftar kolom dengan panjang yang sama yang memiliki label persegi panjang. Oleh karena itu, semua yang dipelajari tentang penamaan, pemilihan, dan penghapusan elemen daftar dapat langsung diterapkan ke Tipe data R dan ke kolom data frame.

Pertanyaan Umum Demo Slot

Vektor memaksa setiap elemen untuk memiliki satu tipe yang sama, sehingga mencampur teks dan angka akan mengubah semuanya menjadi karakter. Daftar (list) menyimpan setiap elemen persis seperti yang diberikan, termasuk vektor, matriks, dan fungsi dengan panjang yang berbeda. Gunakan `typeof()` untuk membedakan keduanya.

Panggil `is.list(x)`, yang mengembalikan `TRUE` untuk daftar dan pasangan daftar. `class(x)` melaporkan kelas objek, sedangkan `typeof(x)` mengembalikan `โ€œlistโ€` bahkan untuk data frame, karena data frame adalah daftar kolom dengan panjang yang sama di bawahnya.

`length(my_list)` hanya menghitung elemen tingkat atas, jadi daftar bersarang tetap dihitung sebagai satu. `lengths(my_list)` melaporkan ukuran setiap elemen dalam satu panggilan, yang lebih cepat dan lebih jelas daripada `loo`.ping ketika elemen-elemennya berbeda.

lapply(my_list, FUN) menerapkan sebuah fungsi Fungsi `sapply()` memproses setiap elemen dan mengembalikan sebuah daftar. `sapply()` menyederhanakan hasilnya menjadi vektor atau matriks jika memungkinkan. Perulangan `for` biasa pada `seq_along(my_list)` juga berfungsi dan mudah dibaca.

Ketika setiap elemen memiliki panjang yang sama, as.data.frame(my_list) langsung berfungsi. Untuk daftar baris dengan lebar yang sama, do.call(rbind, my_list) akan menumpuknya terlebih dahulu. dplyr ekosistem menawarkan as_tibble() ketika tipe kolom harus tetap tidak berubah.

Daftar tidak memiliki fungsi pengurutan bawaan, jadi misalnyatracta comparable key first: my_list[order(sapply(my_list, length))] mengurutkan ulang berdasarkan ukuran elemen. Untuk data persegi panjang, konversikan ke frame dan Urutkan data frame. dengan order() sebagai gantinya.

Asisten AI membaca output str() dan menjelaskan mengapa sebuah indeks mengembalikan NULL atau sublist alih-alih sebuah nilai. Mereka juga menyarankan bentuk kurung yang benar, membuat draf pipeline lapply(), dan menandai konversi tipe data secara diam-diam sebelum merusak hasilnya.

Ya. Kopilot GitHub bekerja di RStudio 2023.09.0 dan versi yang lebih baru melalui Tools, Global Options, lalu pengaturan asisten kode. Ini melengkapi panggilan list(), names() dan unlist() dari komentar, meskipun setiap saran masih perlu ditinjau.

Ringkaslah postingan ini dengan: