390

data.frame の前後の空白に問題があります。

たとえば、特定の条件に基づいて特定rowのものを調べます。data.frame

> 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 つのフレームを結合したい場合です。1 つdata.frameは使用"Austria "し、もう 1 つのフレームは"Austria". マッチングがうまくいきません。

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

これまでのところ、白のペースを取り除く簡単なPerlスクリプトを書いていましたが、何とか R 内でそれを行うことができればいいと思います。

4

15 に答える 15

485

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

後で文字列をクリーンアップする場合は、次の関数のいずれかを使用できます。

# Returns string without leading white space
trim.leading <- function (x)  sub("^\\s+", "", x)

# Returns string without trailing white space
trim.trailing <- function (x) sub("\\s+$", "", x)

# Returns string without leading or trailing white space
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

これらの関数の1つを使用するにはmyDummy$country

 myDummy$country <- trim(myDummy$country)

使用できる空白を「表示」するには、次のようにします。

 paste(myDummy$country)

これにより、引用符( ")で囲まれた文字列が表示され、空白を見つけやすくなります。

于 2010-02-14T13:13:12.817 に答える
93

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

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

(クレジットはコメンターに送られます:R.コットン)

于 2013-02-21T16:30:06.220 に答える
13

print.data.frame広告 1)変更された引数で直接呼び出すことができる空白を確認するには:

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その他のオプションについても参照してください。

于 2010-02-15T10:00:20.660 に答える
11

grepまたはgrepを使用して空白のある観測を見つけ、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"
于 2010-02-14T14:13:46.837 に答える
3

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"   
于 2016-05-04T10:27:58.997 に答える