R Programlamada Listeler: Eleman Oluşturma ve Seçme

⚡ Akıllı Özet

R List, vektörleri, matrisleri, veri çerçevelerini ve hatta diğer listeleri tek bir kapsayıcı içinde depolayan bir nesnedir. `list()` fonksiyonu onu oluşturur ve çift köşeli parantezler herhangi bir öğeyi geri çeker.

  • 🧺 Karışık Depolama: Bir liste, farklı tür ve uzunluktaki nesneleri tutabilir; düz bir vektör ise bunu yapamaz.
  • Yapım Aşaması: list(vect, mat, df) bir vektörü, bir matrisi ve bir veri çerçevesini tek bir nesne içinde birleştirir.
  • 🔢 Pozisyona Erişim: my_list[[2]] öğenin kendisini döndürürken, my_list[2] tek öğeli bir liste döndürür.
  • ???? ️ Adlandırılmış Öğeler: Öğeleri oluşturma aşamasında etiketlemek, $ operatörü veya [[“ad”]] aracılığıyla erişime olanak tanır.
  • ✏️ Yerinde Düzenlemeler: Yeniden atama bir öğeyi günceller, NULL ataması ise onu listeden kaldırır.
  • 🔗 Düzleştirme: unlist() fonksiyonu, iç içe geçmiş bir listeyi sonraki analizler için tek bir atomik vektöre dönüştürür.

R Programlamada Liste Oluşturma ve Eleman Seçme

R Listesi nedir?

R Listesi R programlamada matrisleri, vektörleri, veri çerçevelerini veya listeleri içeren bir nesnedir. R List aynı zamanda bir nesne koleksiyonunu depolamak ve ihtiyaç duyduğumuzda kullanmak için de kullanılır. R listesini pek çok farklı eşyanın konulabileceği bir çanta gibi düşünebiliriz. Bir eşyayı kullanmamız gerektiğinde çantayı açıp kullanabiliyoruz.

Vektörle olan zıtlık, çantayı kullanışlı kılan şeydir. Vektör, her öğeyi tek bir türe zorlar, bu nedenle bir kelimeyi bir sayının yanına koymak, sayıyı metne dönüştürür. Liste böyle bir kural uygulamaz, bu nedenle beş elemanlı bir vektörü, iki satırlı bir listeyi taşıyabilir. matris ve 714 satırlık bir veri çerçevesini, hiçbirini değiştirmeden yan yana koyduk.

R'de Listenin Sözdizimi

R programlama dilinde listeler oluşturmak için `list()` fonksiyonunu kullanabiliriz:

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

Her argüman, olduğu gibi veya şu biçimde sunulabilir: etiket = değer. İsimsiz bir argüman, yalnızca numarasıyla erişilebilen konumlu bir öğe haline gelirken, etiketli bir argüman ayrıca bir isim de kazanır. Temel R referansı için liste() Belgeler hem formları hem de notları içerir ve unlist() fonksiyonunun as.list() fonksiyonunun yaklaşık tersi gibi davrandığını belirtir.

R'de Liste Nasıl Oluşturulur

Aşağıda R'de bir listenin nasıl oluşturulacağına ilişkin adım adım bir süreç verilmiştir:

Aşağıdaki örnekte bir Vector, bir Matrix ve bir Matrix olmak üzere üç farklı nesne oluşturacağız. Veri çerçevesi R'de liste işlevini kullanma.

Adım 1) Bir Vektör Oluşturun

R'de bir vektör oluşturmak için aşağıdaki kodu kullanın

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

İki nokta üst üste operatörü, 1, 2, 3, 4, 5 dizisini bir tamsayı vektörü olarak oluşturur ve atama oku bunu vect adı altında saklar.

Adım 2) Bir Matris Oluşturun

Şimdi, aşağıdaki kodu kullanarak bir matris oluşturun.

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

Burada iki ayrıntıya dikkat çekmek gerekiyor. İki satır ve beş sütundan oluşan bir tablo on değere ihtiyaç duyarken, yalnızca dokuz değer sağlandığı için R, diziyi yeniden kullanır ve veri uzunluğunun satır sayısının alt katı olmadığına dair bir uyarı yazdırır. Bu yeniden kullanılan değer, yazdırılan matrisin ikinci satırının 10 yerine 1 ile bitmesinin nedenidir. Ardından dim() çağrısı şekli rapor eder.

Çıktı:

## [1] 2 5

Adım 3) Veri Çerçevesi Oluşturun

Aşağıdaki kodu kullanarak R'de bir veri çerçevesi oluşturun

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

Yorumda onuncu satırdan bahsediliyor, ancak ifade, yerleşik EuStockMarkets serisinin 1'den 10'a kadar olan satırlarını koruyor. Alt kümeleme ayrıca zaman serisi sınıfını da kaldırıyor, bu nedenle geri dönen şey gerçek bir veri çerçevesi yerine sayısal bir matris oluyor; bu da aşağıda yazdırılan sonucun satır adları yerine [1,] stili satır etiketleri taşımasının tam olarak nedenidir. Gerçek bir veri çerçevesine ihtiyaç duyulduğunda çağrıyı as.data.frame() içine alın.

Adım 4) R'de Liste Oluşturun

Şimdi aşağıdaki kodu kullanarak üç nesneyi R listesine koyabiliriz.

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

Çıktı:

## [[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

Çıktıdaki üç çift köşeli parantez başlığı, liste pozisyonlarını gösterir. Hiçbir şey düzleştirilmedi veya dönüştürülmedi: birinci eleman hala bir tamsayı vektörü, ikinci eleman hala bir matris ve üçüncü eleman hala hisse senedi fiyatlarının on satırının tamamını içeriyor.

R Listesinden Elemanları Seçin

Listemizi oluşturduktan sonra, ona oldukça kolay bir şekilde erişebiliriz. Listedeki bir öğeyi seçmek için [[index]] kullanmamız gerekiyor. Çift köşeli parantez içindeki değer, listeden çıkarmak istediğimiz öğenin konumunu temsil eder.tracÖrneğin, parantez içine 2 yazdığımızda, R listedeki ikinci öğeyi döndürür.

Şimdi bunda R öğreticisi, R'deki my_list adlı listenin ikinci öğelerini seçmeye çalışalım, my_list[[2]] kullanıyoruz

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

Çıktı:

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

Tek ve çift parantezler birbirinin yerine kullanılamaz ve bunların karıştırılması liste hatalarının en yaygın nedenidir. Tek parantez sarmalayıcıyı korurken, iki parantez onu kaldırır.

ifade Geri dönen şey Sonucun sınıfı Bunu ne zaman kullanacaksın?
benim_listem[[2]] Saklanan öğenin kendisi Burada ne saklanırsa saklansın, bir matris Tek bir eleman üzerinde hesaplama yapmanız gerekiyor.
benim_listem[2] O öğeyi içeren bir alt liste liste Liste sarmalayıcısını korumanız gerekiyor.
benim_listem[c(1, 3)] Seçilen öğelerin alt listesi liste Birkaç öğeye aynı anda ihtiyacınız var.
benim_listem[-2] İkinci hariç her öğe liste Bir öğeyi silmeniz gerekiyor.
# 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]

R'de Adlandırılmış Listeler

Konumsal indeksler kırılgandır: bir öğe eklediğinizde, ondan sonraki her sayı kayar. Öğeleri adlandırmak bu riski ortadan kaldırır ve kodun tanımladığı veriler gibi okunmasını sağlar. İsimler liste oluşturulurken verilebilir veya sonradan names() fonksiyonu ile eklenebilir.

# 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"

$ operatörü ve çift parantez, yeni başlayanları yanıltan bir açıdan farklılık gösterir. $ operatörü kısmi eşleştirme yapar, bu nedenle named_list$pri hala fiyatları bulurken, named_list[[“pri”]] NULL döndürür çünkü çift parantez tam olarak eşleşir, ancak exact = FALSE parametresi geçirilmediği sürece. Kısmi eşleştirme konsolda kullanışlıdır ancak bir betikte güvenli değildir, bu nedenle kaydedilmiş kodda tam eşleşmeyi tercih edin.

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

`str()` fonksiyonu, her öğe için türünü ve boyutunu içeren tek bir satır yazdırır; bu, bir listeye indeksleme yapmadan önce listenin beklediğiniz içeriği içerip içermediğini doğrulamanın en hızlı yoludur.

R listesindeki öğeleri değiştirme, ekleme ve silme

Bir liste oluşturulduktan sonra sabit kalmaz. Bir öğeyi okuyan erişimciler aynı zamanda ona yazma işlemi de yaparlar; bu nedenle bir listeyi güncelleme, genişletme ve küçültme işlemlerinin tümü normal atama yöntemini kullanır.

# 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
  • Değiştirin: Mevcut bir isme atama işlemi, o öğenin üzerine yazılır ancak konumu değişmez.
  • ekle: Var olmayan bir isme değer atamak, listenin sonuna yeni bir öğe ekler.
  • Ekle: `append()` fonksiyonu ikinci argüman olarak bir liste alır, bu nedenle doğrudan değeri `list()` içine alıp ardından iletin.
  • Sil: Çift köşeli parantez içinde NULL değeri atamak, öğeyi kaldırır ve listeyi kısaltır.

İnsanların sıklıkla takıldığı bir sonuç şudur: NULL silme anlamına geldiğinden, çift köşeli parantez içinde gerçek bir NULL değeri saklayamazsınız. Bunun yerine, named_list["empty"] <- list(NULL) örneğinde olduğu gibi tek köşeli parantez ataması kullanın; bu, alanı korur ve içine NULL değerini yerleştirir.

R'de İç İçe Listeler ve unlist()

Bir liste herhangi bir R nesnesini içerebileceğinden, başka bir listeyi de içerebilir. Yapılandırma nesneleri, JSON yanıtları ve model sonuçları genellikle R'da iç içe geçmiş şekilde temsil edilir; bu nedenle iç içe geçmiş bir listeye erişmek ve onu düzleştirmek günlük işlerdir.

# 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)

Düzleştirmenin anlaşılması gereken bir maliyeti vardır. `unlist()` tek bir atomik vektör döndürmelidir, bu nedenle her değeri mantıksal, tamsayı, ondalık sayı, karakter sırasıyla en genel türe dönüştürür. Bu nedenle, sayıları metinle karıştıran iç içe bir liste tamamen metin olarak geri döner. Sonuçtaki adlar, dış ve iç etiketlerin birleştirilmesiyle oluşturulur; bu nedenle bir öğe `owner` yerine `meta.owner` olarak gelir.

Bileşik adlar istenmiyorsa `use.names = FALSE` değerini, yalnızca en dış katmanın kaldırılması gerekiyorsa `recursive = FALSE` değerini geçirin. Değerlerin türlerini koruması gerekiyorsa, yapıyı olduğu gibi bırakın ve düzleştirmek yerine liste üzerinde işlem yapın.

R'de Yerleşik Veri Çerçevesi

Listeler genellikle diskten veya web'den okunan verilerle doldurulur, bu nedenle bir veri çerçevesinin içine kaydedilmeden önce nasıl oluşturulduğunu görmek faydalıdır. Kendi veri çerçevemizi oluşturmadan önce, çevrimiçi olarak bulunan R veri setine göz atabiliriz. Hapishane veri seti 714×5 boyutundadır. `tail()` fonksiyonu ile veri çerçevesinin alt kısmına hızlıca göz atabiliriz. Benzer şekilde, `head()` fonksiyonu veri çerçevesinin üst kısmını görüntüler. `head(df, 5)` ile gösterilecek satır sayısını belirtebilirsiniz. `read.csv()` fonksiyonu hakkında daha fazla bilgiyi ilerleyen bölümlerde öğreneceğiz. R'de veri içe aktarma öğretici.

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

Çıktı:

##   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

read.csv()'yi takip eden [1:5] ifadesi, ilk beş satırı değil, ilk beş sütunu seçer; çünkü veri çerçevesi kendi içinde sütunlardan oluşan bir listedir. Bir listede tek köşeli parantez indeksleme daha küçük bir liste döndürür ve burada bu daha küçük liste hala bir veri çerçevesidir.

Veri çerçevesinin yapısını str ile kontrol edebiliriz:

# Structure of the data
str(df)

Çıktı:

## '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 ...

Tüm değişkenler depolanır sayısal Her satırdaki "$" öneki, daha önce adlandırılmış listelerde kullanılan operatörle aynıdır ve bir veri çerçevesinin dikdörtgen bir etiket taşıyan eşit uzunlukta sütunlardan oluşan bir liste olduğunu doğrular. Bu nedenle, liste öğelerini adlandırma, seçme ve silme hakkında öğrenilen her şey doğrudan buraya aktarılır. R veri tipleri ve veri çerçevesi sütunlarına.

SSS

Vektörler, her öğenin aynı türü paylaşmasını zorunlu kılar; bu nedenle metin ve sayıları karıştırmak her şeyi karaktere dönüştürür. Listeler ise vektörler, matrisler ve farklı uzunluktaki fonksiyonlar da dahil olmak üzere her öğeyi tam olarak sağlandığı gibi tutar. İkisini birbirinden ayırmak için `typeof()` fonksiyonunu kullanın.

`is.list(x)` çağrısı, listeler ve çift listeler için TRUE değerini döndürür. `class(x)` nesne sınıfını bildirirken, `typeof(x)` veri çerçeveleri için bile "liste" döndürür, çünkü veri çerçevesi altında eşit uzunlukta sütunlardan oluşan bir listedir.

`length(my_list)` yalnızca en üst düzey öğeleri sayar, bu nedenle iç içe geçmiş bir liste yine de tek bir öğe olarak sayılır. `lengths(my_list)` ise her öğenin boyutunu tek bir çağrıda bildirir; bu, `lengths(my_list)`'ten daha hızlı ve daha anlaşılırdır.ping Elementler farklı olduğunda.

lapply(my_list, FUN) bir işlev Her bir öğeyi tek tek işler ve bir liste döndürür. `sapply()` ise mümkün olduğunda sonucu bir vektöre veya matrise basitleştirir. `seq_along(my_list)` üzerinde basit bir `for` döngüsü de çalışır ve anlaşılır bir şekilde okunur.

Her öğenin uzunluğu aynı olduğunda, as.data.frame(my_list) doğrudan çalışır. Eşit genişlikte satırlardan oluşan bir liste için, do.call(rbind, my_list) önce bunları üst üste yığar. dplyr Ekosistem, sütun tiplerinin dokunulmadan kalması gerektiğinde as_tibble() işlevini sunar.

Listelerin yerleşik bir sıralama özelliği yoktur, bu nedenle örneğintracÖncelikle karşılaştırılabilir anahtar: my_list[order(sapply(my_list, length))] eleman boyutuna göre yeniden sıralar. Dikdörtgen veriler için, çerçeveye dönüştürün ve Veri çerçevesini sırala Bunun yerine order() ile.

Yapay zekâ asistanları, `str()` çıktısını okuyarak bir indeksin neden değer yerine NULL veya alt liste döndürdüğünü açıklıyor. Ayrıca doğru parantez biçimini öneriyor, `lapply()` işlem hatlarını taslak haline getiriyor ve sonucu bozmadan önce sessiz tür dönüştürmeyi işaretliyor.

Evet. GitHub Yardımcı Pilotu çalışır RStudio 2023.09.0 ve sonrasında Araçlar, Genel Seçenekler, ardından kod yardımcısı ayarı aracılığıyla kullanılabilir. Yorumdan list(), names() ve unlist() çağrılarını tamamlar, ancak her önerinin yine de incelenmesi gerekir.

Bu yazıyı şu şekilde özetleyin: