2012-07-18 4 views
9

から行を削除するにはRでのgrepの使用:Iは、これ等のデータフレームを有する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) 

IカラムZの内容に応じて、このデータフレームからのいくつかの行を削除したいです:

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

これは正常です。行7は現在、削除されます。

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

私は希望:私は列Zに存在しないコンテンツを検索するためにはgrepを使用する場合

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 

しかし、データフレームのすべてのコンテンツを削除するようです検索している文字列が存在しなくても、この方法で行を検索したり削除したりすることができます。これについてどうやって行くの?

答えて

18

数値の代わりにTRUE/FALSEサブセットを使用できます。

greplはgrepと似ていますが、logicalベクターが返されます。否定はそれと共に働く。

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

するTry grepl()の代わりに:ここで

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

この場合、grepl、たとえばnew_d <- d[! grepl("K",d$z),]を使用します。

7

はあなたの問題だ

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

否定論理ベクトルは、すべての行のエントリを持っているので、これは動作します:

> 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

完全性のため、 R 3.3.0、grep、友人にはinvert引数が付属しています:

new_d <- d[grep("K", d$z, invert = TRUE)] 
関連する問題