Chcę odfiltrować wiersze z na data.frame
podstawie warunku logicznego. Załóżmy, że mam taką ramkę danych
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
To, czego chcę, to uzyskać nową ramkę danych, która wygląda tak samo, ale ma dane tylko 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 typ 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 ł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 nosi nazwę „wyrażenie”, ale daje wyniki w złym formacie, jak widać.
==
funkcja będzie pobierać wszystkie rekordy NA, a także „hesc”, ale%in%
nie.Użyj
subset
(do użytku interaktywnego)albo lepiej
dplyr::filter()
źródło
subset
ma duże OSTRZEŻENIE: "Jest to wygodna funkcja przeznaczona do użytku interaktywnego. Do programowania lepiej jest używać standardowych funkcji podzbiorów, takich jak [, a w szczególności niestandarowa ocena podzbioru argumentów może mieć nieoczekiwane konsekwencje ”.Przyczyną
expr[expr[2] == 'hesc']
nie jest to, że w przypadku ramki danychx[y]
wybiera kolumny, a nie wiersze. Jeśli chcesz wybrać wiersze,x[y,]
zamiast tego zmień składnię :źródło
NA
rekordy! W związku z tym nie dotyczy. Powód, dla którego wydawało się to prawdą, wynikał z faktu, że ramka danych wyrażenia nie maNA
w filtrowanej kolumnie. Jeśli istniejeNA
, twoja droga nie ma zastosowania, jak powiedziałem wcześniej.Możesz użyć
dplyr
pakietu:źródło
Wydaje się, że nikt nie uwzględnił funkcji która. Może się również przydać do filtrowania.
Spowoduje to również obsługę NA i usunięcie ich z wynikowej ramki danych.
Po uruchomieniu tego na ramce danych 9840 na 24 50000 razy wydaje się, że ta metoda ma 60% szybszy czas działania niż metoda% w%.
źródło
Pracowałem na ramce danych i nie miałem szczęścia z udzielonymi odpowiedziami, zawsze zwracała 0 wierszy, więc znalazłem i użyłem grepl:
Co w zasadzie przycięło moją ramkę danych tylko do wierszy zawierających „łącze w dół” w kolumnie Kierunek transmisji. PS Jeśli ktoś może odgadnąć, dlaczego nie widzę oczekiwanego zachowania, zostaw komentarz.
W szczególności do pierwotnego pytania:
źródło
Czasami kolumna, którą chcesz filtrować, może pojawić się na innej pozycji niż indeks kolumny 2 lub mieć nazwę zmiennej.
W takim przypadku możesz po prostu odnieść nazwę kolumny, którą chcesz filtrować, jako:
źródło
NA
rekordy! W związku z tym nie dotyczy.możemy skorzystać z biblioteki data.table
lub filtruj używając
%like%
operatora do dopasowania wzorcaźródło
To działało na mnie jak magia.
celltype_hesc_bool = expr['cell_type'] == 'hesc'
expr_celltype_hesc = expr[celltype_hesc]
Sprawdź ten wpis na blogu
źródło