9

スペースに基づいてさまざまな列を作成するにはどうすればよいですか。たとえば、「私は出かけます」

ANs 3
Column1 Column2 Column3 Column14 
I          am     going    out
4

4 に答える 4

17

例が示すように、実際の列の値が必要な場合は、テキスト接続からテーブルを読み取ることができます。

> 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]]、結果のリストの最初の要素を取得します。これは、"I am going Out" を唯一の要素とする入力ベクトルの最初の項目に対応します。そこに別のベクトルを渡した場合、リストには複数の要素が含まれているか、空のベクトルの要素がまったくない可能性があります。

スペースがない場合でも、一致がなかったことを示す一致の位置として、gregexprlength のリストを返し1ます。-1これにより、上記のコードはその場合に 1 つの結果を誤って報告します。それを処理し、ベクトルを入力として受け入れる、より精巧なソリューションは次のとおりです。

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

関数は次のように動作します:入力vectorの各要素に対して 1 つずつ、結果のリストgregexprを返します。そのリストを反復処理し、リストの各要素について、一致の数を計算します。一致した位置のベクトルをカウントする代わりに、負でない値のみをカウントするために使用するため、一致の失敗によって発生したものはすべて削除されます。その合計で発生するからへの暗黙の変換があります。の結果は再びベクトルになるため、入力ベクトルとうまく一致します。 ssapplylengthsum-1FALSE/TRUE0/1sapply

この関数は、 1 つのコメントで要求されているように、データ フレームを書き換えるために使用できます。したがって、列に文字列があり、これらのカウントを新しい列に含めるように変更する必要があるというデータフレームがfooあるbarとしますbaz。これを次のように書くことができます

foo <- transform(foo, baz = countSpaces(bar))
于 2012-09-13T09:34:54.107 に答える
5

別の方法は、strsplit関数を使用することです。

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

したがって、最初の引数を - I am going Out2 番目の引数 - 空のスペースで分割します。次に、次を使用できますlength

R> length(strsplit("I am going Out", " ")[[1]])
[1] 4
于 2012-09-13T09:46:00.587 に答える
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))
于 2012-09-13T14:43:53.553 に答える