Bir veri çerçevesini filtreleme


12

Hala R temel fonksiyonları öğrenme, Altküme fonksiyonu sadece bir koşul birden çok koşullu veya olmayan tek sütun dayalı filtre temel alıyor gibi görünüyor?

Bir veri çerçevesinden verileri kolayca nasıl filtreleyebilirim?

  1. size birden fazla koşul verildiğinde

  2. Koşulun kullanılabilir sütunlara uygulanması gerektiğinde.

Örnek: Şunları içeren bir veri çerçevesi verildi

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Diyelim ki bu veri çerçevesini filtrelemek istiyorum, böylece sadece D1'den D4'e herhangi bir 'E' olduğunda isimler olmalı,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

D1'in büyük bir sütun listesi olabileceğini, bu filtreyi gerçekleştirmek için önerilen yaklaşımın nasıl veya ne olduğunu varsayalım. teşekkür ederim

Yanıtlar:


26

Altküme işlevinde birkaç filtreyi birleştirmek istiyorsanız mantıksal işleçleri kullanın:

 subset(data, D1 == "E" | D2 == "E")

sütun D1 veya sütun D2'nin değeri "E" olan satırları seçer. Kullanılabilir mantıksal işleçler için yardım sayfalarına bakın:

 > ?"|"

İkinci sorunuz için ihtiyacınız olan şey satırları filtrelemektir. Bu, aşağıdaki şekilde gerçekleştirilebilir

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

İlk argüman için geçerlidir suplies biz filtreye ihtiyaç hangi sütunları. İkinci argüman 1'dir, yani veri satırları arasında dolaşıyoruz. Üçüncü argümanın adı , satırda "E" varsa TRUE , "E" yoksa FALSE döndüren tek satırlık bir işlevdir .

Uygula işlevinin sonucu , uzunluktaki verilerdeki satır sayısıyla aynı olan mantıksal vektör sel olacaktır . Daha sonra bu vektörü gerekli satırları seçmek için kullanırız.

Güncelleme

Aynı şey grep ile elde edilebilir:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

R grep'te varsayılan bağımsız değişkenlerle, sağlanan vektörde eşleşen desene sahip öğe sayısını döndürür.


2
bir başka yararlı işlev any. Örneğin, bir vektörün en az bir öğesinin = 10yazma ( any(v==10)) olduğunu kontrol etmek istiyorsanız .
nico

@nico yeah, ancak % v içinde% 10 , 9 karakter ve herhangi bir 10 ile varyant var :). Her ne kadar sayısal vektörler için eşitlik kullanmak daha iyidir, çünkü R akıllıdır ve verileriniz gerçek sayılarla karıştırılmış tamsayılarsa, veri kümenizde 10 olduğunu doğru olarak tanıyacaktır.
mpiktas

düzenli ifade için durum ne olacak? tam bir eşleşme ile çalışmak istemediğinizi varsayarsak? Diğer dillerde olduğu gibi ~ = 'ya yakın bir şeyleri var mı?
R'deki

See @Biorelated grepve agrepPOSIX 1003,2 ya Perl uyumlu regex üzerinde ve ilgili belgeleri.
chl

@Biorelated, cevabı grep örneği ile güncelledim.
mpiktas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.