2

このコードの場合:

> grep("abc","abcabcabc", value=FALSE)
[1] 1

文字列に「abc」が表示されるすべてのインデックスが得られると思いました。私は何か間違ったことをしていますか?文字列内のパターンのすべての出現を見つけるために使用する別の方法はありますか?

4

2 に答える 2

11

gregexpr()代わりに使用してください:

gregexpr("abc","abcabcabc")
[[1]]
[1] 1 4 7
attr(,"match.length")
[1] 3 3 3
attr(,"useBytes")
[1] TRUE

これは、位置 1、4、および 7 に一致があることを示しています。各一致の長さは 3 文字でした。


追加の属性なしで、一致の位置のみを印刷する場合は、次のトリックを利用します。

x <- gregexpr("abc","abcabcabc")
lapply(x, c)
[[1]]
[1] 1 4 7

c()これは、すべての引数から属性を削除するという事実を利用しています。したがって、lapplyリストをトラバースし、各要素をに渡しc()、属性なしで同じ要素を取得するために使用します。


OK、私は代理でリプリーされました。

使用しないでくださいlapply(x, c)。代わりにこれを行います:

lapply(x, as.vector)
[[1]]
[1] 1 4 7

理由については、fortune(185)

library(fortunes)
fortune(185)

I don't like to see the use of c() for its side effects. In this case Marc's
as.vector seems to me to be self-explanatory, and that is a virtue in programming
that is too often undervalued.
   -- Brian D. Ripley (on how to convert a matrix into a vector)
      R-help (March 2007)
于 2012-12-06T15:27:51.933 に答える
4

grep一致が見つかったインデックス値のみを返します。

x <- c('a', 'b', 'aa', 'abc', 'bc')

grep('a', x)
# [1] 1 3 4

インデックスではなく一致value = TRUEを返すために使用することもできます。grep

gsubユースケースに応じて、またはを使用しますgregexpr。これらすべての機能のヘルプは、すべて同じページに含まれています?grep

于 2012-12-06T15:28:03.930 に答える