web-dev-qa-db-ja.com

先頭と末尾の空白を削除する方法

Data.frameの先頭と末尾の空白に問題があります。例えば、私はdata.frame内の特定のrowを特定の条件に基づいて見てみたいのです。

> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] 

[1] codeHelper     country        dummyLI    dummyLMI       dummyUMI       
[6] dummyHInonOECD dummyHIOECD    dummyOECD      
<0 rows> (or 0-length row.names)

私のdata.frameにオーストリアが明らかに存在していたので、どうして私は期待したアウトプットを得られなかったのか疑問に思いました。私のコード履歴を調べて、何が悪かったのかを見つけ出そうとした後、私は試してみました。

> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
   codeHelper  country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18        AUT Austria        0        0        0              0           1
   dummyOECD
18         1

私が命令の中で変更したのは、オーストリアの後の追加の空白文字だけです。

さらに厄介な問題が明らかに発生します。たとえば、国の列に基づいて2つのフレームを結合したい場合などです。一方のdata.frame"Austria "を使用し、もう一方のフレームは"Austria"を持ちます。マッチングは機能しません。

  1. 問題を認識できるように、画面に空白を「表示」するいい方法はありますか?
  2. そして、Rの先頭と末尾の空白を削除できますか?

これまでは、空白を削除する簡単なPerlスクリプトを書いていましたが、R内でなんらかの方法でそれを実行できればいいでしょう。

331
mropa

おそらく最善の方法は、データファイルを読むときに末尾の空白を処理することです。 read.csvまたはread.tableを使用する場合は、パラメーターstrip.white=TRUEを設定できます。

後で文字列をきれいにしたい場合は、以下の関数の1つを使用できます。

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

myDummy$countryでこれらの関数の1つを使うには:

 myDummy$country <- trim(myDummy$country)

あなたが使用することができる空白を '表示'するには:

 paste(myDummy$country)

これは引用符( ")で囲まれた文字列を表示し、空白を見つけやすくします。

435
f3lix

R 3.2.0から、先頭/末尾の空白を削除するための新しい関数が導入されました。

trimws()

参照: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html

485
wligtenberg

空白を操作するには、stringrパッケージのstr_trim()を使用してください。このパッケージのマニュアルは2013年2月15日付けでCRANにあります。この関数は文字列ベクトルも処理できます。

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(クレジットはコメンターに行く:R. Cotton)

84
userJT

先頭と末尾の空白を削除する単純な関数

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

使用法:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"
23

ad1)空白を見るには、引数を変更して直接print.data.frameを呼び出すことができます。

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

他のオプションについては?print.data.frameも参照してください。

11
Marek

Grepまたはgreplを使用して空白を含む観測値を見つけ、それらを削除するにはsubを使用してください。

names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1]  TRUE FALSE  TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"  

私はuser56にコメントとして答えを追加することを好むがそれでも独立した答えとしてそう書くことができない。先頭と末尾の空白の削除は、gdataパッケージのtrim()関数によっても実現できます。

require(gdata)
example(trim)

使用例

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"
5
KAA

別の選択肢は、stringiパッケージからstri_trim関数を使用することです。デフォルトでは先頭と末尾の空白を削除します。

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"

先頭の空白を削除するだけの場合は、stri_trim_leftを使用します。末尾の空白を削除するだけの場合は、stri_trim_rightを使用します。他の先頭または末尾の文字を削除したい場合は、それをpattern =で指定する必要があります。

詳細については?stri_trimも参照してください。

5
Jaap

入力間に複数のスペースがあると、別の関連問題が発生します。

> a <- "  a string         with lots   of starting, inter   mediate and trailing   whitespace     "

split引数に正規表現を使用すると、この文字列を簡単に「実際の」トークンに分割できます。

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

(空でない)文字列の先頭に一致がある場合、出力の最初の要素は '""'ですが、文字列の末尾に一致がある場合、出力は次のようになります。マッチが削除されました。

4
TMOTTM

先頭と末尾の空白をトリミングするtrim.strings ()関数を作成しました。

# Arguments:    x - character vector
#            side - side(s) on which to remove whitespace 
#                   default : "both"
#                   possible values: c("both", "leading", "trailing")

trim.strings <- function(x, side = "both") { 
    if (is.na(match(side, c("both", "leading", "trailing")))) { 
      side <- "both" 
      } 
    if (side == "leading") { 
      sub("^\\s+", "", x)
      } else {
        if (side == "trailing") {
          sub("\\s+$", "", x)
    } else gsub("^\\s+|\\s+$", "", x)
    } 
} 

説明のために、

a <- c("   ABC123 456    ", " ABC123DEF          ")

# returns string without leading and trailing whitespace
trim.strings(a)
# [1] "ABC123 456" "ABC123DEF" 

# returns string without leading whitespace
trim.strings(a, side = "leading")
# [1] "ABC123 456    "      "ABC123DEF          "

# returns string without trailing whitespace
trim.strings(a, side = "trailing")
# [1] "   ABC123 456" " ABC123DEF"   
1
Bryan

私はtrim()を試しました。空白文字と '\ n'の両方でうまく機能します。 x = '\ nハーデン、J\n'

トリム(x)

1
J.Dan

最善の方法はtrimws()です

次のコードはこの関数をデータフレーム全体に適用します

mydataframe < - data.frame(lapply(mydataframe、trimws)、stringsAsFactors = FALSE)

1
Santosh Kadge
myDummy[myDummy$country == "Austria "] <- "Austria"

この後、あなたはRが "オーストリア"をレベルとして認識しないように強制する必要があります。レベルとして "USA"と "Spain"もあるとしましょう。

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

最高得票数の回答よりも少々威圧的ですが、それでも機能するはずです。

0
David Mitchell