Filtrowanie ramki danych

12

Wciąż uczysz się podstawowych funkcji w R, funkcja podzbioru wydaje się filtrować tylko warunek oparty na pojedynczej kolumnie z wieloma warunkami lub bez?

Jak mogę łatwo filtrować dane z ramki danych?

  1. gdy otrzymasz wiele warunków

  2. Kiedy warunek należy zastosować w dostępnych kolumnach.

Przykład: biorąc pod uwagę ramkę danych zawierającą

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

powiedz, że chcę filtrować tę ramkę danych, aby tylko nazwy, w których dowolna z D1 do D4 była „E”, to powinienem mieć,

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

Powiedz, że D1 może być dużą listą kolumn, jak lub jakie jest zalecane podejście do wykonania tego filtra? Dziękuję Ci

eastafri
źródło

Odpowiedzi:

26

Jeśli chcesz połączyć kilka filtrów w funkcji podzbioru, użyj operatorów logicznych:

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

wybierze wiersze, dla których kolumna D1 lub kolumna D2 ma wartość „E”. Przejrzyj strony pomocy dla dostępnych operatorów logicznych:

 > ?"|"

W drugim pytaniu potrzebujesz odfiltrować wiersze. Można to osiągnąć w następujący sposób

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

Pierwszy argument do zastosowania zawiera kolumny, na których musimy filtrować. Drugi argument to 1, co oznacza, że ​​przeglądamy rzędy danych. Trzeci argument to nienazwana funkcja jednowierszowa, która zwraca PRAWDA, jeśli „E” jest obecne w wierszu, i FALSE, jeśli „E” nie jest obecne.

Wynikiem funkcji Apply będzie logiczny wektor sel , który ma długość równą liczbie wierszy w danych. Następnie używamy tego wektora, aby wybrać niezbędne wiersze.

Aktualizacja

To samo można osiągnąć za pomocą grep:

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

w R grep z domyślnymi argumentami zwraca liczbę elementów w dostarczonym wektorze, które mają pasujący wzorzec.

mpiktas
źródło
2
inną przydatną funkcją jest any. Na przykład, jeśli chcesz sprawdzić, czy przynajmniej jeden element wektora jest = 10napisany ( any(v==10)).
nico,
@nico tak, ale 10% w% v ma 9 znaków i wariant z dowolnymi 10 :). Chociaż w przypadku wektorów numerycznych lepiej jest używać równości, ponieważ R jest inteligentny i jeśli twoje dane są liczbami całkowitymi pomieszanymi z liczbami rzeczywistymi, poprawnie rozpozna, że ​​masz 10 w zbiorze danych.
mpiktas 12.01.11
co z przypadkiem wyrażenia regularnego? zakładając, że nie chcesz pracować z dopasowaniem ścisłym? Czy mają coś zbliżonego do ~ = jak w innych językach? co jest najbardziej zbliżone do tego wyrażenia w R
eastafri,
@Biorelated Zobacz grepi agreppowiązaną dokumentację dotyczącą POSIX 1003.2 lub wyrażenia regularnego zgodnego z Perl.
chl
@ Biorelated, zaktualizowałem odpowiedź na przykładzie grep.
mpiktas