Bir Liste Her Şeyi Tutar
Bir vektörün katı tek bir kuralı vardır: her eleman aynı türde olmalıdır. Bir listenin böyle bir kuralı yoktur. Bir listenin her elemanı farklı bir tür, farklı bir uzunluk, hatta başka bir liste olabilir. R'nin genel amaçlı kabıdır:
length() 4 bildirir - biri (scores) kendi içinde üç sayı barındırsa bile dört eleman. Bir liste bölmelerini sayar, içindekileri değil. str() (structure), bir listenin gerçekte ne tuttuğunu görmenin en hızlı yoludur - eleman başına ismi, türü ve bir önizlemesiyle tek satır. str() refleks olsun: bir fonksiyon size bir şey verdiğinde ve ne olduğundan emin olmadığınızda, str() uygulayın.
İsimler isteğe bağlıdır (list(1, "a", TRUE) geçerlidir) ama neredeyse her zaman koymaya değer - isimli bir liste kendini belgeler.
İçeri Giren Üç Yol: [, [[ ve $
Bu, listelerin herkesin bir kez yanlış anladığı kısmıdır; o yüzden tam olarak doğru anlayalım. Üç erişim operatörü vardır ve iki farklı iş yaparlar:
[daha küçük bir liste döndürür - seçtiğiniz her neyse onu tutan, aynı türden bir kap.[[elemanın kendisini döndürür - bölmenin içindeki asıl değeri.$, birebir isimle kullanılan[[için kısayoldur:person$age,person[["age"]]demektir.
Fark, gelişigüzel yazdırdığınızda görünmezdir ve hesaplamaya çalıştığınız anda apaçık olur:
person["scores"] sınıfı "list"'tir - içinde scores vektörü olan, uzunluğu 1 bir liste. person[["scores"]] sınıfı "numeric"'tir - mean() için hazır, vektörün kendisi. Tek köşeli parantezli sürüm üzerinde mean() çağırırsanız argümanın sayısal olmadığına dair bir hata alırsınız; bu hata mesajı neredeyse her zaman [[ demek isterken [ kullandığınızın işaretidir.
Akılda kalan bir benzetme: liste bir trendir. [ size daha kısa bir tren verir - hâlâ bir tren. [[ bir vagonu açar ve yükü elinize verir.
Peki [ ne zaman doğru araçtır? Birkaç eleman istediğinizde ve onları paketli tutmak istediğinizde:
İki elemanı aynı anda "kendileri olarak" çekemezsiniz - iki değer bir kaba ihtiyaç duyar - dolayısıyla çok elemanlı seçim her zaman tek köşeli parantezlidir ve her zaman bir liste verir.
Bir fark daha: $ kısmi eşleştirme kullanır (belirsizlik yoksa person$sc ifadesi scores elemanını bulur); bu konsolda kullanışlı, betiklerde ise bir yüktür. Çalışmaya devam etmesi gereken kodda tam isimle [[ tercih edin - ayrıca bir değişkende saklanan ismi de kabul eder, $ bunu yapamaz.
Ekleme, Değiştirme, Silme
Listeler düz atamayla büyür ve küçülür - özel bir ekleme metodu gerekmez:
- Henüz var olmayan bir isme atama yapmak elemanı ekler.
- Var olan bir isme atama yapmak onu değiştirir.
length(x) + 1konumuna atama yapmak isimsiz bir eleman ekler.NULLatamak elemanı tamamen siler - liste kısalır. (NULLyalnızca burada bir silme komutu gibi davranır; bir bölmede gerçekten "hiçbir şey" saklamanız gerekiyorsax["k"] <- list(NULL)kullanın.)
İki listeyi uç uca yapıştırmak için c(), vektörlerde olduğu gibi listelerde de çalışır: c(list_a, list_b) daha uzun tek bir liste döndürür.
İç İçe Listeler
Bir liste elemanı başka bir liste olabildiği için listeler herhangi bir derinlikte iç içe geçer - bu da onları ayrıştırılmış JSON ya da gruplanmış sonuçlar gibi yapılandırılmış veriler için R'nin doğal biçimi yapar:
İçeri inmek yalnızca erişimcileri zincirlemektir - her $ ya da [[ bir düzey daha derine iner. İç içe bir yapı kafa karıştırıcı hâle geldiğinde str(company) tüm ağacı bir kerede gösterir ve str(company, max.level = 1) yalnızca en üst katmanı gösterir.
unlist() ile Düzleştirme
unlist(), ne kadar derin iç içe olursa olsun bir listeyi tek bir vektöre çöktürür:
Fark edilecek iki şey var. Birincisi, unlist() sizin için isimler kurar (math1, math2, art), böylece her değerin nereden geldiğini hâlâ anlayabilirsiniz. İkincisi - ve tuzak budur - bir vektör yalnızca tek bir tür tutar, dolayısıyla karışık bir listeyi düzleştirmek her şeyi mevcut en esnek türe zorlar. 1 sayısı "1" metni olarak geri döndü. Düzleştirdiğinizde sayılarınız metne dönüşüyorsa, liste sandığınız kadar tekdüze değilmiş demektir.
Listeler Neden Önemli
Listeler, aşacağınız bir başlangıç konusu gibi hissettirebilir. Tam tersi - dilin tamamında yük taşıyıcıdırlar:
- Birkaç şey döndüren fonksiyonlar bir liste döndürür. R fonksiyonları tek bir nesne döndürür; bir liste, o tek nesnenin burada bir uydurulmuş değeri, orada bir katsayı tablosunu taşımasını sağlar. Bir regresyon çalıştırdığınızda geri aldığınız model nesnesi (büyük, sınıflandırılmış) bir listedir - üzerinde
str()çalıştırmak bunu kanıtlar. - Bir veri çerçevesi sütunlardan oluşan bir listedir - üstüne fazladan davranış eklenmiş, eşit uzunlukta vektörler. Az önce öğrendiğiniz her şey (
$,[[, bir elemanı düşürmek içinNULLatamak) veri çerçevesi sütunlarına harfiyen uygulanır. - apply ailesi -
lapply()ve arkadaşları - bir liste alır, her elemana bir fonksiyon uygular ve bir liste geri verir. Liste girer, liste çıkar; R'de tekrarlı hesaplamanın standart biçimi budur.
Buradan Ne Çıkarıyorsunuz
- Listeler her şeyi tutar: karışık türler, eşit olmayan uzunluklar, başka listeler, bütün veri çerçeveleri.
[daha küçük bir liste döndürür;[[elemanın kendisini döndürür;$, birebir isimle[[demektir. Matematiğe mi uzanıyorsunuz? İstediğiniz[[ya da$'dır.- Yeni bir isme atayarak ekleyin,
NULLatayarak silin,c()ile birleştirin. unlist()bir vektöre düzleştirir ve yol boyunca karışık türleri zorlar - sonucun sınıfını kontrol edin.- Veri çerçeveleri sütunlardan oluşan listelerdir, dolayısıyla bu bilgi doğrudan aktarılır.
Sırada: matrisler - listenin tek türlü, satırlı ve sütunlu muadili.
Sıkça Sorulan Sorular
R'de [ ile [[ arasındaki fark nedir?
Tek köşeli parantez [ her zaman seçilen elemanları içeren bir liste döndürür - aynı türden daha küçük bir kap. Çift köşeli parantez [[ ise içine uzanır ve elemanın kendisini döndürür. x$scores bir numeric vektör tutuyorsa x["scores"] uzunluğu 1 olan bir liste, x[["scores"]] ise numeric vektörün kendisidir. Değerle gerçekten çalışmak istediğinizde [[ (ya da $) kullanın.
R'de bir listeye nasıl eleman eklenir?
Henüz var olmayan bir isme atama yapın: x$email <- "rosa@example.com" ya da x[["email"]] <- .... Liste otomatik olarak büyür. İsimsiz eklemek için bir sonraki konuma atayın: x[[length(x) + 1]] <- value. Bir elemanı silmek için ona NULL atayın: x$email <- NULL.
R'de bir liste vektöre nasıl dönüştürülür?
unlist(x), bir listeyi (iç içe olanlar dahil) tek bir vektöre düzleştirir. Bir vektör yalnızca tek bir tür tuttuğu için her şey mevcut en esnek türe zorlanır - sayılar ve metinlerden oluşan bir liste tamamen character bir vektöre dönüşür. Düzleştirdikten sonra sonucun class() değerini kontrol edin.