2012-09-13 6 views
6

は、どのように私は例えば、スペースに基づいて別の列を作成することができます:あなたは、実際の列の値をしたい場合はあなたの例はそうと、文字列内のスペースの数を探す

ANs 3 
Column1 Column2 Column3 Column14 
I   am  going out 
+0

をしたい場合、私はあなたが後にしているかわからないんだけどけれどもおそらく、あなたは 'read.fwf'をしたいです。 –

答えて

14

を「私は外出しています」示すために、あなたはテキスト接続からテーブルを読み取ることができます。

> read.table(textConnection("I am going Out")) 
    V1 V2 V3 V4 
1 I am going Out 

あなたの質問のタイトルに答えるために、すなわちがあるかスペース多く、あなたは上記の列をカウントするncolを使用することができ、 1を引く。あなたはスペースの数でだけ興味を持っている場合は、以下では、より効率的である:

length(gregexpr(" ", "I am going Out")[[1]]) 

これは、スペースを検索するための正規表現を使用しています。

[[1]]は、結果のリストの最初の要素を取ります。これは、入力ベクトルの最初の項目に対応し、 "午前中"が唯一の要素です。そこに別のベクトルを渡した場合、リストには複数の要素が含まれている場合もあれば、空のベクトルの要素がない場合もあります。

にスペースがない場合は、gregexprはまだ試合がなかったことを示すために、試合の位置として-1で、長さ1のリストを返します。これにより、上記のコードはその場合に1つの結果を誤って報告します。それを扱っても、入力としてベクトルを受け入れ、より精巧な解決策は、以下の通りである。

countSpaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) }) } 

次のように機能が動作します:gregexprは、入力の各要素に対してリスト結果の、1を返します。 ベクターssapplyはそのリストに対して反復処理を行い、リストの各要素に対して一致数を計算します。一致する位置のベクトルのlengthをカウントする代わりに、sumを使用して、負でない値をカウントするだけで、一致しなかったために-1が削除されます。その合計で起こっているFALSE/TRUEから0/1への暗黙の変換があります。 sapplyの結果は、やはりベクトルになり、したがって入力ベクトルとうまく一致します。

この関数は、one commentで要求されているように、データフレームを書き換えるために使用できます。だからfooという名前のデータフレームがあり、それはbarという列に文字列があり、新しい列にこれらの数を含めるように変更する必要があるとします。baz - I am going Out - 2番目の引数で - 空のスペース

R> strsplit("I am going Out", " ")[[1]] 
[1] "I"  "am" "going" "Out" 

だから我々は最初の引数を分割:あなたは、もう一つの方法は、strsplit機能を使用することです

foo <- transform(foo, baz = countSpaces(bar)) 
+0

+1。彼らは何を望むかによって、これはより適切かもしれません: '長さ(gregexpr(" [] + "、"私は外出しています ")[[1]])'(回答= 3)。そのフレーズ(余分なスペースを使用)では、使用した方法が各スペースをカウントします。 – A5C1D2H2I1M1N2O1R2T1

+1

うん。コメントに複数のスペースを追加するにはどうすればよいですか? – A5C1D2H2I1M1N2O1R2T1

+2

@mrdwab、http://meta.stackexchange.com/questions/30020/multiple-spaces-in-code-in-comments-get-merged-into-oneを参照してください。回避策:U + 00A0ユニコードコードポイントとして入力された非区切りスペースを使用します。 – MvG

3

としてこれを書くことができます。その後、我々はちょうどlengthを使用することができます。

R> length(strsplit("I am going Out", " ")[[1]]) 
[1] 4 
+0

しかし、私たちは言葉の数を知りたくありません。だから私はMvGの答えがより適切だと思う。 – rinni

+0

私は@ MvGの答えが良いことに同意するが、私は "私たちは単語の数を知らない"あなたのコメントに従っていない – csgillespie

+0

まあ、_spaces_の数と_words_の数を知りたい。あなたは単語の数を計算します。 – rinni

3

私は、これは可能性が何であるか、あなたが後にしているが、ではないかもしれないので、私は本当に慎重に読んでいない認めなければなりません。..

x <- "I am going Out" 
nchar(x)- nchar(gsub(" ", "", x)) 

MVGのオリジナルの提案に代わるもの(以下かなりが):

as.data.frame(matrix(unlist(strsplit("I am going Out", "\\s+", perl=TRUE)), nrow=1)) 
1

またstringrパッケージからstr_countを使用することができます。これらはあまり冗長ではなく、正規表現を避けることは少し速くなる可能性があります。

library(stringr) 
text = "I am going Out" 
#matches regular expression 
str_count(text, ' ') 

それとも、あなたがより速く何か

#matches literal text 
str_count(text, fixed(' ')) 
関連する問題