web-dev-qa-db-ja.com

Rでは、gsubを使用してピリオドを除くすべての句読点を削除します

私はRを初めて使用するので、あなたが私を助けてくれることを願っています。

データに小数点と負の記号を保持できるように、gsubを使用してピリオドとマイナス記号を除くすべての句読点を削除したいと思います。

私のデータフレームzには次のデータがあります。

_     [,1] [,2]   
[1,] "1"  "6"    
[2,] "2@"  "7.235"
[3,] "3"  "8"    
[4,] "4"  "$9"   
[5,] "£5" "-10" 
_

gsub("[[:punct:]]", "", z)を使用して句読点を削除したい。

現在の出力

_> gsub("[[:punct:]]", "", z)
     [,1] [,2]  
[1,] "1"  "6"   
[2,] "2"  "7235"
[3,] "3"  "8"   
[4,] "4"  "9"   
[5,] "5"  "10" 
_

ただし、「-」記号と「。」は残しておきます。符号。

必要な出力

_ PSEUDO CODE:  
> gsub("[[:punct:]]", "", z, except(".", "-") )
         [,1] [,2]  
    [1,] "1"  "6"   
    [2,] "2"  "7.235"
    [3,] "3"  "8"   
    [4,] "4"  "9"   
    [5,] "5"  "-10" 
_

一部の文字をgsub()関数から除外する方法はありますか?

15

あなたはこのようにいくつかのマッチを戻すことができます:

 sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))
     X..1. X..2.  
[1,] "1"   "6"    
[2,] "2"   "7.235"
[3,] "3"   "8"    
[4,] "4"   "9"    
[5,] "5"   "-10"  

ここで私は.および-

そして、次のステップは、結果を数値行列に強制することですSOここでは、次のように2つのステップを組み合わせます。

matrix(as.numeric(sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))),ncol=2)
   [,1]    [,2]
[1,]    1   6.000
[2,]    2   7.235
[3,]    3   8.000
[4,]    4   9.000
[5,]    5 -10.000
13
agstudy

このコードを試すことができます。とても重宝しました。

x <- c('6,345', '7.235', '8', '$9', '-10')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)

[1] "6345"  "7.235" "8"     "9"     "-10"

x <- c('1', '2@', '3', '4', '£5')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)

[1] "1" "2" "3" "4" "5"

このコードは、英数字の用語を含まないすべてのものを置き換えます。次に、例外リストに追加します。ここでは、ハイフン(\-)、フルストップ(\。)、スペース(\ s)を追加しています。

2
user6793824

それについて考えるもう1つの方法は、何を保持したいですか?正規表現を使用して、情報を保持することも、情報を省略することもできます。 1回のパスで複数の行からユニットを削除して変換するために必要なデータフレームがたくさんあります。これらのインスタンスでは、applyファミリーから何かを使用するのが最も簡単です。

例を再現する:

a <- c('1', '2@', '3', '4', '£5')
b <- c('6', '7.235', '8', '$9', '-10')
z <- matrix(data = c(a, b), nrow = length(a), ncol=2)

次に、applygsubと組み合わせて使用​​します。

apply(z, 2, function(x) as.numeric(gsub('[^0-9\\.\\-]', '', x)))
      [,1]    [,2]
[1,]    1   6.000
[2,]    2   7.235
[3,]    3   8.000
[4,]    4   9.000
[5,]    5 -10.000

これは、数字、ピリオド、ハイフン/ダッシュ以外のすべてに一致するようにRに指示します。個人的には、これらの状況で使用する方がずっとクリーンで簡単で、同じ出力が得られます。

また、ドキュメントには、これらの強力でありながら混乱を招く正規表現がよく説明されています。

https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html

または?regex

1
hubbs5

以下は、基本R (g)subおよびstringr削除/置換関数の両方を使用して、Rで汎用文字クラスを制限するいくつかのオプションです。

(g)sub with Perl=TRUE

[[:punct:]]ブラケット式を[:punct:] POSIX文字クラスで使用して、右側の直後の文字が(?!\.)と等しくないことを要求する.否定先読みで制限することができます。

(?!\.)[[:punct:]]      # Excluding a dot only
(?![.-])[[:punct:]]    # Excluding a dot and hyphen

1つまたは複数の出現に一致させるには、それを非キャプチャグループでラップし、+数量詞をグループに設定します。

(?:(?!\.)[[:punct:]])+   # Excluding a dot only
(?:(?![.-])[[:punct:]])+ # Excluding a dot and hyphen

removeで一致が見つかった場合、両方の式は同じ結果になりますが、replaceを他の式で置き換える必要があることに注意してください文字列/文字、定量化により、置換パターンが1回出現するだけで、連続する文字チャンク全体を変更できます。

With stringr replace/remove functions

詳細に入る前に、[[:punct:]]で使用されるPCRE (g)subは、 ICU regexライブラリ を利用するstringr regex関数の同じ文字と一致しないことに注意してください。代わりに[\p{P}\p{S}]を使用する必要があります。「 R/regex with stringi/ICU」を参照してください。「+」が非[:punct:]文字と見なされるのはなぜですか?

ICU regexライブラリには、文字クラス減算と呼ばれる文字クラスで使用できる素晴らしい機能があります。

したがって、文字クラス、たとえば、[\p{P}\p{S}]のようなすべての句読点に一致するクラスを記述してから、1つまたは2つまたは3つの文字、または(=subtract)を「除外」したい場合charsのサブクラス全体。次の2つの表記法を使用できます。

[\p{P}\p{S}&&[^.]]   # Excluding a dot
[\p{P}\p{S}--[.]]    # Excluding a dot
[\p{P}\p{S}&&[^.-]]  # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]]   # Excluding a dot and hyphen

この方法で1回以上連続する出現に一致させるには、ラッピンググループは必要ありません。単に+を使用します。

[\p{P}\p{S}&&[^.]]+  # Excluding a dot
[\p{P}\p{S}--[.]]+   # Excluding a dot
[\p{P}\p{S}&&[^.-]]+  # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]]+   # Excluding a dot and hyphen

Rの出力を使用したデモテスト を参照してください。

x <- "Abc.123#&*xxx(x-y-z)???? some@other!chars."

gsub("(?!\\.)[[:punct:]]", "", x, Perl=TRUE)
## => [1] "Abc.123xxxxyz someotherchars."
gsub("(?!\\.)[[:punct:]]", "~", x, Perl=TRUE)
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
gsub("(?:(?!\\.)[[:punct:]])+", "~", x, Perl=TRUE)
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."

library(stringr)
stringr::str_remove_all(x, "[\\p{P}\\p{S}&&[^.]]") # Same as "[\\p{P}\\p{S}--[.]]"
## => [1] "Abc.123xxxxyz someotherchars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]", "~")
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]+", "~")  # Same as "[\\p{P}\\p{S}--[.]]+"
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."
0