13

我有一个这样的数据框:

    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 搜索 z 列中不存在的内容时,它似乎删除了数据框的所有内容:

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

我想以这种或其他方式搜索和删除行,即使我正在搜索的字符串不存在。如何解决这个问题?

4

4 回答 4

25

您可以使用 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
于 2012-07-18T14:51:17.453 回答
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
于 2012-07-18T14:51:29.823 回答
3

为了完整起见,从 R 3.3.0 开始,grep朋友们提出了一个invert论点:

new_d <- d[grep("K", d$z, invert = TRUE)]
于 2017-10-18T12:18:51.353 回答
1

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

于 2012-07-18T14:50:25.523 回答