Menu

R'da Veri Filtreleme ve Alt Küme Alma (subset, [ ], dplyr filter)

İstediğiniz satır ve sütunları tutmanın her yolu: köşeli parantezle mantıksal maskeler, tek satırlık subset(), %in%, NA tuzakları ve dplyr'ın filter() ile select() fonksiyonları.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Satırları Filtreleme: Mantıksal Maske

R'da bir veri çerçevesini filtrelemek için köşeli parantezlerin satır konumuna bir koşul koyun: df[condition, ]. Koşul, satır başına bir tane olmak üzere TRUE/FALSE vektörüne dönüşür ve R, TRUE olan satırları tutar:

scores[scores$score > 80, ] ifadesini içeriden dışarıya okuyun: scores$score > 80 ifadesi TRUE FALSE TRUE TRUE FALSE üretir ve köşeli parantezler 1, 3 ve 4. satırları tutar. Sondaki virgül isteğe bağlı değildir. Bir veri çerçevesinde köşeli parantezler [satırlar, sütunlar] alır; sütun yuvasını boş bırakmak "tüm sütunlar" demektir. Virgülü unutursanız satır yerine sütunları indekslersiniz - R'ın en yaygın başlangıç hatalarından biri.

Yazdırılan satır numaralarının 1 2 3 değil, 1 3 4 olduğuna dikkat edin - filtreleme, orijinal satır etiketlerini korur. Zararsızdır, ama insanları şaşırtır.

Çoklu Koşullar: & ve | (&& Değil)

Koşulları & (VE) ve | (VEYA) ile birleştirin. Her koşul kendi eksiksiz karşılaştırmasını alır:

Tuzak: R'da && ve || de vardır ve burada & ile | yerine kullanılamazlar. Çift formlar tekil değerlerde çalışır (if koşulları için vardırlar); bütün sütunlar verildiğinde modern R (4.3+), 'length = 5' in coercion to 'logical(1)' gibi bir hatayla durur; eski R ise sessizce yalnızca ilk satırı karşılaştırırdı - ki bu tartışmasız daha kötüydü. Köşeli parantezlerin içinde her zaman tek & ve |. Operatörler dokümanı bu ayrımı tam olarak ele alır.

%in%: Bir Değer Kümesiyle Eşleştirme

Bir sütun birkaç değerden herhangi biriyle eşleşmesi gerektiğinde, == ifadelerini | ile zincirlemeyin - %in% kullanın:

x %in% set, x'in set içindeki değerlerden biri olduğu her yerde TRUE döndürür. status == "pending" | status == "shipped" ifadesinden daha iyi okunur, istenilen sayıda değere ölçeklenir ve temiz bir şekilde olumsuzlanır: !(orders$status %in% c("refunded")).

Sütun Seçme

Köşeli parantezlerin sütun yuvası ad veya konum alır:

İki not. Ada göre seçmek, sütunların yeniden sıralanmasından etkilenmez; konuma göre seçmek (scores[, c(1, 3)]) birinin araya sütun eklediği gün bozulur. Ve tek bir sütun istemek, veri çerçevesi değil, düz bir vektör döndürür - ikinci print()'in etrafında tablo olmadan 91 88 göstermesinin nedeni budur. Veri çerçevesi biçimini korumanız gerektiğinde drop = FALSE ekleyin: scores[, "score", drop = FALSE].

subset(): Dostane Temel R Tek Satırlığı

Temel R, satırları ve sütunları tek bir okunabilir çağrıda halleden bir sarmalayıcı sunar - $ yok, virgül takibi yok:

subset() içinde sütun adlarını çıplak yazarsınız (scores$score değil, score) - fonksiyon onları veri çerçevesine karşı değerlendirir. Buna standart dışı değerlendirme denir ve belgelenmiş bir uyarısı vardır: adları çalışma zamanında, kendi fonksiyonlarınızın içinde yanlış davranabilecek şekillerde çözer (fonksiyonunuzdaki score adlı bir değişken, score adlı bir sütun tarafından gölgelenebilir). Doğrudan ?subset sayfasından gelen pratik kural: etkileşimli kullanımda harika, programlamada kaçının - orada köşeli parantez indekslemesi kullanın.

NA Tuzağı

NA ile yapılan bir karşılaştırma FALSE değil, NA üretir - ve köşeli parantez filtrelemesi, maskesi NA olan satırları NA dolu satırlar olarak tutar:

İlk sonuç, NA'lerden oluşan gereksiz bir satır içerir çünkü 2. satırın koşulu ne TRUE ne de FALSE idi. Çözüm, !is.na() koşulunu açıkça eklemektir. subset() ve dplyr'ın filter() fonksiyonlarının ikisi de koşulu NA olan satırları sessizce atar - pratiktir, ama bunun olduğunu bilin. Eksik değerler dokümanı, NA'nin neden böyle yayıldığını ele alır.

dplyr Yolu: filter() ve select()

dplyr paketi işi iki fiile böler - satırlar için filter(), sütunlar için select() - çıplak sütun adlarıyla ve df$ tekrarı olmadan (statik; kum havuzu yalnızca temel R çalıştırır):

library(dplyr)

scores |> filter(score > 80)
scores |> filter(score > 80, team == "red")     # comma = AND
scores |> filter(status %in% c("pending", "shipped"))
scores |> select(name, score)
scores |> filter(team == "red") |> select(name, score)

filter(), koşulu NA olan satırları otomatik olarak atar ve her zaman bir veri çerçevesi döndürür (asla çıplak bir vektör değil) - bu, yukarıdaki her iki temel R tuzağını da ortadan kaldırır. Bunun bedeli bir paket bağımlılığı ve subset() ile aynı standart dışı değerlendirme uyarılarıdır - tüm fiil turu için dplyr girişine bakın.

Öğrendikleriniz

  • df[condition, ] temel deyimdir - ve virgül zorunludur.
  • Koşulları tek & ve | ile birleştirin; && vektörlerde hata verir.
  • Bir değer kümesiyle eşleştirmede %in%, zincirlenmiş == ifadelerinden üstündür.
  • Sütunları ada göre seçin ve tek sütunların drop = FALSE olmadıkça vektöre düştüğünü unutmayın.
  • subset() keyifli etkileşimli tek satırlıktır; köşeli parantezler programlanabilir olandır.
  • NA ile karşılaştırmalar köşeli parantezlerde hayalet satırlar üretir - !is.na() ile koruyun.

Sırada: sütun ekleme ve dönüştürme - df$new <- ..., ifelse() ve dplyr'ın mutate() fonksiyonu.

Sıkça Sorulan Sorular

R'da bir veri çerçevesinin satırlarını nasıl filtrelerim?

Köşeli parantezlerin satır konumuna bir mantıksal koşul koyun: df[df$score > 80, ]. Koşul bir TRUE/FALSE vektörü üretir ve R, TRUE olan satırları tutar. Virgül önemlidir - satır filtresini (boş) sütun filtresinden ayırır. subset(df, score > 80) aynı işi daha az yazarak yapar.

R'da birden fazla koşulla nasıl filtreleme yaparım?

Koşulları & (VE) ve | (VEYA) ile birleştirin: df[df$score > 80 & df$team == "red", ]. Tek & kullanın, && değil - çift form yalnızca tekil değerlerde çalışır ve modern R'da vektörlerde hata verir.

R'da subset() ile köşeli parantez filtrelemesi arasındaki fark nedir?

Aynı satırları tutarlar, iki farkla: subset(), koşulun NA olduğu satırları sessizce atar (köşeli parantezler onları NA dolu satırlar olarak tutar) ve subset() standart dışı değerlendirme kullanır - sütun adlarını çıplak yazarsınız; bu etkileşimli kullanımda pratiktir ama kendi fonksiyonlarınızın içinde güvenilmezdir.

Bir sütunun bir değer listesiyle eşleştiği satırları nasıl filtrelerim?

%in% kullanın: df[df$team %in% c("red", "blue"), ], takımı listelenen değerlerden herhangi biri olan satırları tutar. | ile birleştirilmiş bir dizi == karşılaştırmasının yerini alır ve =='in aksine asla NA döndürmez.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA