Data.frame satırlarını mantıksal bir koşula göre filtreleme


155

data.frameMantıksal bir koşula dayanarak satırları filtrelemek istiyorum . Diyelim ki veri çerçevem ​​var

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

Ne istiyorum aynı görünüyor ama sadece bir cell_type için veri olan yeni bir veri çerçevesi elde etmektir. Örneğin, "hesc" hücre türünü içeren alt küme / seçme satırları:

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

Veya hücre tipi "bj fibroblast" veya "hesc":

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

Bunu yapmanın kolay bir yolu var mı?

Denedim:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

orijinal veri çerçevesine "ifade" denir, ancak sonuçları gördüğünüz gibi yanlış biçimde verir.

Yanıtlar:


210

Bir 'cell_type' (örneğin 'hesc') 'ye göre satır seçmek için şunu kullanın ==:

expr[expr$cell_type == "hesc", ]

İki veya daha fazla farklı 'hücre_türüne' (ör. 'Hesc' veya 'bj fibroblast') göre satır seçmek için şunu kullanın %in%:

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
Bu ==işlevin NA kayıtlarının yanı sıra "hesc" yi de %in%alacağını unutmayın , oysa bu olmayacaktır.
Matt Parker

Bunun şimdi işe yarayıp yaramadığını merak ediyorum. Veri çerçevesini duruma göre alt kümesi bulamadım.
Sumanth Lazarus

85

Kullanım subset(etkileşimli kullanım için)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

ya da daha iyisi dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
Dikkatli! Dokümantasyonu subsetbüyük bir UYARI: "Bu, etkileşimli olarak kullanılması amaçlanan bir kolaylık işlevidir. Programlama için, [gibi standart alt kümeleme işlevlerini kullanmak daha iyidir ve özellikle bağımsız değişken alt kümesinin standart dışı değerlendirilmesinin beklenmedik sonuçları olabilir ."
Aleksandar Dimitrov

33

Bunun nedeni expr[expr[2] == 'hesc'], bir veri çerçevesi için x[y]satırları değil sütunları seçmesidir. Satır seçmek istiyorsanız, söz dizimine geçin x[y,]:

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

Bu da herhangi bir NAkayıt alacak ! Bu nedenle, uygulanamaz. Doğru olmasının nedeni, ifade edilen veri NAçerçevesinin filtrelenmiş sütunda hiç olmamasıdır . Orada NAvarsa, yolunuz daha önce söylediğim gibi geçerli değildir.
Erdoğan CEVHER

26

dplyrPaketi kullanabilirsiniz :

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

Kimse hangi işlevi dahil etmemiş gibi görünüyor. Filtreleme için de yararlı olabilir.

expr[which(expr$cell == 'hesc'),]

Bu aynı zamanda NA'ları da ele alacak ve bunları sonuçtaki veri çerçevesinden çıkaracaktır.

Bunu 9840 x 24 veri çerçevesinde 50000 kez çalıştırmak, hangi yöntemin% in% yönteminden% 60 daha hızlı çalışma süresine sahip olduğu anlaşılıyor.


4

Ben bir veri çerçevesi üzerinde çalışıyordu ve sağlanan cevaplar ile hiç şansı yok, her zaman 0 satır döndürdü, bu yüzden buldum ve grepl kullanılır:

df = df[grepl("downlink",df$Transmit.direction),]

Temelde veri çerçevemi yalnızca Gönderme yönü sütununda "aşağı bağlantı" içeren satırlara kırptı. Not: Eğer kimse neden beklenen davranışı göremediğimi tahmin edebilirse, lütfen bir yorum bırakın.

Özellikle orijinal soruya:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

Bazen filtrelemek istediğiniz sütun, sütun dizini 2'den farklı bir konumda görünebilir veya değişken adına sahip olabilir.

Bu durumda, filtrelemek istediğiniz sütun adına şu şekilde başvurabilirsiniz :

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

Bu da herhangi bir NAkayıt alacak ! Bu nedenle, uygulanamaz.
Erdoğan CEVHER

0

data.table kütüphanesini kullanabiliriz

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

veya %like%desen eşleşmesi için operatör kullanarak filtreleme

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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.