2012-07-18 12 views
9

Mam dataframe taki jak ten:Stosując grepa w R usunąć wierszy z data.frame

d <- data.frame(cbind(x=1, y=1:10, z=c("apple","pear","banana","A","B","C","D","E","F","G")), stringsAsFactors = FALSE) 

ja jak usunąć kilka rzędów z tego dataframe, w zależności od zawartości kolumny Z :

new_d <- d[-grep("D",d$z),] 

Działa to dobrze; Wiersz 7 jest teraz usunięte:

new_d 
    x y  z 
    1 1 1 apple 
    2 1 2 pear 
    3 1 3 banana 
    4 1 4  A 
    5 1 5  B 
    6 1 6  C 
    8 1 8  E 
    9 1 9  F 
    10 1 10  G 

Jednak kiedy używam grep do wyszukiwania treści, która nie jest obecna w kolumnie z, wydaje się, aby usunąć całą zawartość dataframe:

new_d <- d[-grep("K",d$z),] 
    new_d 
    [1] x y z 
    <0 rows> (or 0-length row.names) 

bym lubię wyszukiwać i usuwać wiersze w ten lub inny sposób, nawet jeśli ciąg znaków, którego szukam, nie jest obecny. Jak to zrobić?

Odpowiedz

18

Można używać podzbiorów PRAWDA/FAŁSZ zamiast numerycznych.

jest jak grep, ale zwraca wektor logical. Negacja działa z tym.

d[!grepl("K",d$z),] 
    x y  z 
1 1 1 apple 
2 1 2 pear 
3 1 3 banana 
4 1 4  A 
5 1 5  B 
6 1 6  C 
7 1 7  D 
8 1 8  E 
9 1 9  F 
10 1 10  G 
1

Chcesz użyć grepl w tym przypadku, np. new_d <- d[! grepl("K",d$z),].

7

Oto problem:

> grep("K",c("apple","pear","banana","A","B","C","D","E","F","G")) 
integer(0) 

Spróbuj Grepl() zamiast:

d[!grepl("K",d$z),] 

To działa, ponieważ zanegowana logiczne wektor posiada wpis dla każdego rzędu:

> grepl("K",d$z) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
> !grepl("K",d$z) 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
0

Dla kompletności, ponieważ R 3.3.0, grep i przyjaciele pochodzą z argumentem invert:

new_d <- d[grep("K", d$z, invert = TRUE)] 
Powiązane problemy