关于数据框:在R中使用grep从数据框中删除行

Using grep in R to delete rows from a data.frame

我有一个这样的数据框:

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

我想从此数据框中删除一些行,具体取决于z列的内容:

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

这很好用; 现在删除第7行:

1
2
3
4
5
6
7
8
9
10
11
    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搜索z列中不存在的内容时,似乎删除了数据框的所有内容:

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

我想以这种或另一种方式搜索和删除行,即使我搜索的字符串不存在。 怎么办呢?


您可以使用TRUE / FALSE子设置而不是数字。

grepl类似于grep,但是它返回logical向量。 否定就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
 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
2
> grep("K",c("apple","pear","banana","A","B","C","D","E","F","G"))
integer(0)

尝试使用grepl():

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

之所以可行,是因为取反的逻辑向量每行都有一个条目:

1
2
3
4
> 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

为了完整起见,从R 3.3.0开始,grep和朋友带有invert参数:

1
new_d <- d[grep("K", d$z, invert = TRUE)]


在这种情况下,您想使用grepl,例如new_d <- d[! grepl("K",d$z),]