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 サブセットを使用できます。

greplgrep に似ていますが、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 に答える
1

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

于 2012-07-18T14:50:25.523 に答える