22

R文字列内の繰り返し文字を削除する関数を実装したいと思います。たとえば、関数の名前がremoveRSであるとすると、次のように動作するはずです。

  removeRS('Buenaaaaaaaaa Suerrrrte')
  Buena Suerte
  removeRS('Hoy estoy tristeeeeeee')
  Hoy estoy triste

私の関数はスペイン語で書かれた文字列で使用されるため、3 つ以上の連続する母音を持つ単語を見つけることはあまり一般的ではありません (少なくとも正しくはありません)。それらの背後にある可能性のある感情について気にする必要はありません。それにもかかわらず、2 つの連続する子音 (特に ll と rr) を持つことができる単語がありますが、関数からこれをスキップできます。

要約すると、この関数は少なくとも 3 回連続して現れる文字をその文字だけに置き換える必要があります。上記の例の 1 つで、aaaaaaaaaは に置き換えられaます。

でこのタスクを実行するためのヒントを教えていただけますRか?

4

3 に答える 3

37

私はこれについてあまり慎重に考えていませんでしたが、これは正規表現で参照を使用する私の簡単な解決策です:

gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte')
# [1] "Buena Suerte"

()最初に文字をキャプチャし、\\1その文字を参照し+ます。これは、1回以上一致することを意味します。これらすべてを組み合わせると、文字を2回以上一致させることができます。

英数字以外の文字を含めるには[[:alpha:]]、含めたいものに一致する正規表現に置き換えます。

于 2012-06-22T23:59:50.047 に答える
7

問題の説明のあいまいさに注意を払う必要があると思います。これは最初の刺し傷ですが、明らかに「Good Luck」では期待どおりに機能しません。

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="")
removeRS('Buenaaaaaaaaa Suerrrrte')
#[1] "Buena Suerte"
于 2012-06-22T22:52:38.147 に答える