Mam ramkę danych o nazwie „mydata”, która wygląda następująco:
A B C D
1. 5 4 4 4
2. 5 4 4 4
3. 5 4 4 4
4. 5 4 4 4
5. 5 4 4 4
6. 5 4 4 4
7. 5 4 4 4
Chciałbym usunąć wiersz 2,4,6. Na przykład:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Odpowiedzi:
Kluczową ideą jest utworzenie zestawu wierszy, które chcesz usunąć, i zachowanie uzupełnienia tego zestawu.
W R uzupełnienie zbioru jest podawane przez operator „-”.
Zakładając, że
data.frame
nazywa się tomyData
:Oczywiście nie zapomnij o „ponownym przypisaniu”,
myData
jeśli chcesz całkowicie upuścić te wiersze --- w przeciwnym razie R po prostu drukuje wyniki.źródło
,
tam! ;)drop = FALSE
tam.-
jej użyć, to nie zadziała, ponieważ operatorem dopełniającym dla logiki jest!
. Uzupełnienie c (2,4,6) w wierszach byłoby raczej ustawione na różnicę (c (2,4,6), 1: nrow (myData)), która nie jest c (-2, -4, -6) , chociaż oba przyniosłyby te same wiersze, gdy były używane z[
.myData[-c(2, 4, 6),,drop=F]
. W rzeczywistości sugerowałbym, aby zawsze wstawiać,drop=F
tuż przed]
dostępem do macierzy.Możesz także pracować z tak zwanym wektorem boolowskim, czyli
logical
:Zauważ, że
!
operator działa jako NIE, tzn .!TRUE == FALSE
:To wydaje się nieco kłopotliwe w porównaniu z odpowiedzią @ mrwab (+1 btw :)), ale wektor logiczny można wygenerować w locie, np. Gdy wartość kolumny przekracza pewną wartość:
Możesz przekształcić wektor boolowski w wektor indeksów:
Wreszcie, bardzo fajną sztuczką jest to, że możesz użyć tego rodzaju podzestawu nie tylko do ekstrakcji, ale także do przypisania:
gdzie kolumna
A
jest przypisanaNA
(nie liczba), gdzieA
przekracza 4.źródło
Problemy z usuwaniem według numeru wiersza
W celu szybkich i brudnych analiz można usunąć wiersze data.frame według numeru, zgodnie z pierwszą odpowiedzią. To znaczy,
Jeśli jednak próbujesz napisać solidny skrypt analizy danych, na ogół powinieneś unikać usuwania wierszy według pozycji liczbowej. Wynika to z faktu, że kolejność wierszy danych może ulec zmianie w przyszłości. Ogólna zasada tabel data.frame lub baz danych polega na tym, że kolejność wierszy nie powinna mieć znaczenia. Jeśli kolejność ma znaczenie, należy ją zakodować w zmiennej rzeczywistej w pliku data.frame.
Na przykład wyobraź sobie, że po sprawdzeniu danych i zidentyfikowaniu numerów wierszy, które chcesz usunąć, zaimportowałeś zestaw danych i usunąłeś wiersze według pozycji numerycznej. Jednak w pewnym momencie przechodzisz do surowych danych, rozglądasz się i porządkujesz dane. Twój kod usuwania wierszy usunie teraz nieprawidłowe wiersze, a co gorsza, prawdopodobnie nie pojawi się żaden błąd z ostrzeżeniem, że tak się stało.
Lepsza strategia
Lepszą strategią jest usuwanie wierszy na podstawie istotnych i stabilnych właściwości wiersza. Na przykład, jeśli masz
id
zmienną kolumnową, która jednoznacznie identyfikuje każdy przypadek, możesz tego użyć.Innym razem będziesz mieć formalne kryteria wykluczenia, które można określić, i możesz użyć jednego z wielu narzędzi podziału w R, aby wykluczyć przypadki oparte na tej regule.
źródło
Utwórz kolumnę id w ramce danych lub użyj dowolnej nazwy kolumny, aby zidentyfikować wiersz. Używanie indeksu jest niesprawiedliwe do usunięcia.
Użyj
subset
funkcji, aby utworzyć nową ramkę.źródło
W uproszczonej kolejności:
Po sekwencji:
W kolejności ujemnej:
Lub jeśli chcesz podzielić, wybierając liczby nieparzyste:
Lub jeśli chcesz podzielić, wybierając liczby nieparzyste, wersja 2:
Lub jeśli chcesz dokonać podzbioru, odfiltrowując liczby parzyste:
Lub jeśli chcesz podzielić, odfiltrowując liczby parzyste, wersja 2:
źródło
Usuń Dan z worker.data - Nie musisz zarządzać nową ramką data.frame.
źródło
Oto szybka i brudna funkcja usuwania wiersza według indeksu.
Jego główną wadą jest to, że argument row_index nie odpowiada wzorcowi R bycia wektorem wartości. Mogą występować inne problemy, ponieważ spędziłem tylko kilka minut na pisaniu i testowaniu, a zacząłem używać R w ciągu ostatnich kilku tygodni. Wszelkie uwagi i poprawki w tym zakresie byłyby mile widziane!
źródło
Dla kompletności dodam, że można to zrobić
dplyr
również przy użyciuslice
. Zaletą korzystania z tego jest to, że może on być częścią przepływu pracy w potoku.Oczywiście możesz go również używać bez rur.
Format „nie wektorowy”
-c(2, 4, 6)
oznacza uzyskanie wszystkiego, czego nie ma w wierszach 2, 4 i 6. Na przykład przy użyciu zakresu, powiedzmy, że chcesz usunąć pierwsze 5 wierszy, możesz to zrobićslice(df, 6:n())
. Aby uzyskać więcej przykładów, zobacz dokumenty .źródło