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"
を持ちます。マッチングは機能しません。
これまでは、空白を削除する簡単なPerl
スクリプトを書いていましたが、R内でなんらかの方法でそれを実行できればいいでしょう。
おそらく最善の方法は、データファイルを読むときに末尾の空白を処理することです。 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)
これは引用符( ")で囲まれた文字列を表示し、空白を見つけやすくします。
R 3.2.0から、先頭/末尾の空白を削除するための新しい関数が導入されました。
trimws()
参照: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
空白を操作するには、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)
先頭と末尾の空白を削除する単純な関数:
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
使用法:
> text = " foo bar baz 3 "
> trim(text)
[1] "foo bar baz 3"
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
も参照してください。
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"
別の選択肢は、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
も参照してください。
入力間に複数のスペースがあると、別の関連問題が発生します。
> 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"
(空でない)文字列の先頭に一致がある場合、出力の最初の要素は '""'ですが、文字列の末尾に一致がある場合、出力は次のようになります。マッチが削除されました。
先頭と末尾の空白をトリミングする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"
私はtrim()を試しました。空白文字と '\ n'の両方でうまく機能します。 x = '\ nハーデン、J\n'
トリム(x)
最善の方法はtrimws()です
次のコードはこの関数をデータフレーム全体に適用します
mydataframe < - data.frame(lapply(mydataframe、trimws)、stringsAsFactors = FALSE)
myDummy[myDummy$country == "Austria "] <- "Austria"
この後、あなたはRが "オーストリア"をレベルとして認識しないように強制する必要があります。レベルとして "USA"と "Spain"もあるとしましょう。
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
最高得票数の回答よりも少々威圧的ですが、それでも機能するはずです。