文字列からすべての空白を削除するにはどうすればよいですか?


152

そう" xx yy 11 22 33 "なるでしょう"xxyy112233"。どうすればこれを達成できますか?

回答:


258

一般に、ベクトル化されたソリューションが必要なので、より良いテスト例を次に示します。

whitespace <- " \t\n\r\v\f" # space, tab, newline, 
                            # carriage return, vertical tab, form feed
x <- c(
  " x y ",           # spaces before, after and in between
  " \u2190 \u2192 ", # contains unicode chars
  paste0(            # varied whitespace     
    whitespace, 
    "x", 
    whitespace, 
    "y", 
    whitespace, 
    collapse = ""
  ),   
  NA                 # missing
)
## [1] " x y "                           
## [2] " ← → "                           
## [3] " \t\n\r\v\fx \t\n\r\v\fy \t\n\r\v\f"
## [4] NA

ベースRアプローチ: gsub

gsub文字列(fixed = TRUE)または正規表現(fixed = FALSE、デフォルト)のすべてのインスタンスを別の文字列に置き換えます。すべてのスペースを削除するには、次を使用します。

gsub(" ", "", x, fixed = TRUE)
## [1] "xy"                            "←→"             
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA 

DWinが指摘したように、この場合fixed = TRUEは必須ではありませんが、固定文字列のマッチングは正規表現のマッチングよりも高速であるため、パフォーマンスはわずかに向上します。

すべてのタイプの空白文字を削除する場合は、次を使用します。

gsub("[[:space:]]", "", x) # note the double square brackets
## [1] "xy" "←→" "xy" NA 

gsub("\\s", "", x)         # same; note the double backslash

library(regex)
gsub(space(), "", x)       # same

"[:space:]"すべてのスペース文字に一致するR固有の正規表現グループです。 \s同じことをする言語に依存しない正規表現です。


stringrアプローチ:str_replace_allstr_trim

stringrベースR関数の周りに人間が読める形式のラッパーを提供します(2014年12月現在、開発バージョンには、上にビルドされたブランチがありstringi、以下で説明します)。[を使用した上記のコマンドと同等のものは次のとおりstr_replace_all][3]です。

library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")

stringrstr_trim先頭と末尾の空白のみを削除する機能もあります。

str_trim(x) 
## [1] "x y"          "← →"          "x \t\n\r\v\fy" NA    
str_trim(x, "left")    
## [1] "x y "                   "← → "    
## [3] "x \t\n\r\v\fy \t\n\r\v\f" NA     
str_trim(x, "right")    
## [1] " x y"                   " ← →"    
## [3] " \t\n\r\v\fx \t\n\r\v\fy" NA      

stringiアプローチ:stri_replace_all_charclassstri_trim

stringiは、プラットフォームに依存しないICUライブラリに基づいて構築されており、広範な文字列操作関数のセットを備えています。上記と同等のものは次のとおりです。

library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")

次に"\\p{WHITE_SPACE}"、空白と見なされるUnicodeコードポイントのセットの代替構文を示します。これは"[[:space:]]""\\s"およびと同等space()です。より複雑な正規表現の置換には、もありstri_replace_all_regexます。

stringiトリム機能もあります

stri_trim(x)
stri_trim_both(x)    # same
stri_trim(x, "left")
stri_trim_left(x)    # same
stri_trim(x, "right")  
stri_trim_right(x)   # same

2
@アニコ。fixed = TRUEを使用した理由はありますか?
IRTFM

2
@DWinおそらく、Rが正規表現のものを呼び出す必要がないことを知っていれば、より高速になります。この場合、それは実際には何の違いもありません、私はそうする習慣があるだけです。
Aniko、

間に差がある"[[:space:]]"とは"\\s"
Sacha Epskamp、

5
flyordie.sin.khk.be/2011/05/04/day-35-replacing-charactersを確認するか、単に?regexと入力すると、[:space:]が「スペース文字:タブ、改行」に使用されていることがわかります。 、垂直タブ、フォームフィード、キャリッジリターン、スペース。」それはスペースだけではあり
ません

1
@アニコ大きな編集を気にしないでほしい。この質問は非常に人気があるため、回答をより徹底する必要があるように見えました。
リッチーコットン

18

str_trim(、side = "both")で文字列の最初と最後から空白を削除する「stringr」パッケージについて学習しましたが、次のような置換関数もあります。

a <- " xx yy 11 22 33 " 
str_replace_all(string=a, pattern=" ", repl="")

[1] "xxyy112233"

3
ストリンガーパッケージは、すべてのエンコーディングでうまく機能しません。stringiパッケージはより良いソリューションです。詳細については、github.com
Rexamine / stringiを

8

上記の魂はスペースのみを削除することに注意してください。パッケージstri_replace_all_charclassからタブまたは新しい行を使用する場合も使用しstringiます。

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"

4
stringiパッケージは現在CRANにあります。お楽しみください!:)
bartektartanus 2014年

1
上記のこのコマンドは正しくありません。正しい方法はstri_replace_all_charclass( "ala \ t ma \ n kota"、 "\\ p {WHITE_SPACE}"、 "")です
Lucas

5
stringi数か月間使用して、それがどれほど強力で効率的であるかを見て学んだ後、それは文字列操作のための私の頼りになるパッケージになりました。君たちはそれで素晴らしい仕事をした。
Rich Scriven 2014

7

[[:blank:]]あらゆる種類の水平方向の空白文字に一致させるために使用します。

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"

6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

tidyverseのstr_squish()パッケージからの機能stringrが魔法をかけます!

library(dplyr)
library(stringr)

df <- data.frame(a = c("  aZe  aze s", "wxc  s     aze   "), 
                 b = c("  12    12 ", "34e e4  "), 
                 stringsAsFactors = FALSE)
df <- df %>%
  rowwise() %>%
  mutate_all(funs(str_squish(.))) %>%
  ungroup()
df

# A tibble: 2 x 2
  a         b     
  <chr>     <chr> 
1 aZe aze s 12 12 
2 wxc s aze 34e e4

4
コードにリンクしないでください。回答のテキスト本文に追加し、ここで説明して、回答に長期的な価値を与えます。
Rバラブラマニアン2018

このガイドラインを思い出させてくれた@RBalasubramanianに感謝します。将来はそれについていきます。
damianooldoni

これが質問にどのように答えるかはわかりません。str_squishすべてのスペースが削除されるわけではありません。複数のスペースを切り取って1つに置き換えます。
イラクサ

0

このようにして、データフレーム内のすべての文字変数からすべてのスペースを削除できます。一部の変数のみを選択する場合は、mutateまたはを使用しますmutate_at

library(dplyr)
library(stringr)

remove_all_ws<- function(string){
    return(gsub(" ", "", str_squish(string)))
}

df<-df %>%  mutate_if(is.character, remove_all_ws)

-1

ストリンガーライブラリからこれを試すことができます:

  1. 連続する空白を削除する
  2. 空白を埋める

    ライブラリ(ストリンガー)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.