Filtruj dane.wiersze ramek według warunku logicznego

Chcę filtrować wiersze z data.frame na podstawie warunku logicznego. Załóżmy, że mam ramkę danych jak

   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

Chcę otrzymać nową ramkę danych, która wygląda tak samo, ale ma tylko dane dla jednego typu cell_type. Np. podzbiór / wybierz wiersze zawierające typ komórki "hesc":

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

Lub typu komórki "bj fibroblast" lub "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
Czy jest na to jakiś łatwy sposób?

Próbowałem:

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

Jeśli oryginalna ramka danych jest wywołana "expr" , ale daje wyniki w złym formacie, jak widać.

Author: Henrik, 2009-11-06

7 answers

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

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
 163
Author: learnr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-06 10:08:47

Użyj subset (do interaktywnego użytku)

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

Lub lepiej dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))
 73
Author: rcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 06:33:21

Powodem, dla którego expr[expr[2] == 'hesc'] nie działa, jest to, że dla ramki danych x[y] wybiera kolumny, a nie wiersze. Jeśli chcesz wybrać wiersze, Zmień zamiast tego składnię x[y,]:

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc
 27
Author: Ken Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-09 17:35:10

Możesz użyć dplyr pakietu:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
 18
Author: nathaneastwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-04 13:12:25

Czasami kolumna, którą chcesz filtrować, może znajdować się w innej pozycji niż indeks kolumny 2 lub mieć nazwę zmiennej.

W tym przypadku możesz po prostu odwołać się do nazwy kolumny , którą chcesz filtrować jako:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
 2
Author: Daniel Bonetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 14:16:52

Wydaje się, że nikt nie uwzględnił funkcji which. Może również okazać się przydatny do filtrowania.

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

To również obsłuży NAs i upuści je z wynikowej ramki danych.

Uruchamiając to na 9840 przez 24 dataframe 50000 razy, wydaje się, że metoda która ma 60% szybszy czas pracy niż metoda %in%.

 1
Author: christopher van hoecke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 15:14:13

Pracowałem nad ramką danych i nie miałem szczęścia z dostarczonymi odpowiedziami, zawsze zwracało 0 wierszy, więc znalazłem i użyłem grepl:

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

Który w zasadzie przycinał moją ramkę danych tylko do wierszy, które zawierały "łącze w dół" w kolumnie kierunek transmisji. P. S. Jeśli ktoś może odgadnąć, dlaczego nie widzę oczekiwanego zachowania, proszę zostawić komentarz.

Konkretnie do pytania pierwotnego:

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

expr[grepl("bj fibroblast|hesc",expr$cell_type),]
 0
Author: Justin Harbour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 21:46:29