2012-07-18 64 views
9

我有一个数据帧这如一个删除行:R中使用grep从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) 

我想从这个数据框中删除某些行,这取决于列z的内容:

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

这工作正常;第7行现在删除:

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 

然而,当我使用grep搜索是不存在的列ž内容,似乎要删除的数据帧的所有内容:

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

我会喜欢以这种或其他方式搜索和删除行,即使我正在搜索的字符串不存在。如何去做这件事?

回答

18

您可以使用TRUE/FALSE子集代替数字。

grepl就像grep,但它返回一个logical向量。否定与它一起工作。

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

这是你的问题:

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

尝试grepl()代替:

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)]