2011-12-01 9 views
3

colsplitを使用してデータフレーム内のベクターを分割しようとしています。 colsplitの引数として正規表現を使用しているということは、柔軟性があると思っていますが、私は問題を抱えています(Rの正規表現を理解していない可能性があります)。ここでR + reshape:colsplit with regex

は問題です:

のベクトルを作成してみましょう...

> library(reshape) 
> my_var_1 <- factor(c("x00_aaa_123","x00_bbb_123","x00_ccc_123","x01_aaa_123","x01_bbb_123","x01_ccc_123","x02_aaa_123","x02_bbb_123","x02_ccc_123")) 

私は最初のアンダースコア時に2列に分割したいと思います。言い換えれば は、私はそれを行いますCOLSPANの内部右正規表現が、運を見つけようとしています

x whatever 
1 x00 aaa_123 
2 x00 bbb_123 
3 x00 ccc_123 
4 x01 aaa_123 
5 x01 bbb_123 
6 x01 ccc_123 
7 x02 aaa_123 
8 x02 bbb_123 
9 x02 ccc_123 

...私の最終的な結果は、このようにしたいです。ここで私が得ることができる最も近い...簡単な区切り文字として分割された正規表現を使用し、それは私に3つの列を与える

> colsplit(my_var_1, split="_", c("x","whatever")) 
    x whatever NA. 
1 x00  aaa 123 
2 x00  bbb 123 
3 x00  ccc 123 
4 x01  aaa 123 
5 x01  bbb 123 
6 x01  ccc 123 
7 x02  aaa 123 
8 x02  bbb 123 
9 x02  ccc 123 

です。私は2番目のアンダースコアを分割しないでください(私の実際のデータでは、2つだけでなく、任意の数のアンダースコアがあります)。

"分割"に使用できる式がありますか?

私はcolsplitの正規表現でグループに一致させることができ、グループの一致は分割の内容になることを期待していましたが、そのようには見えません。

*編集(thanks to @Joshuaulrich)colsplit worksは、新しいreshape2を使用する場合、「意図したとおりに」動作します。

答えて

6

あなたのコードは私のためにエラーがスローされます:

> colsplit(my_var_1, split="_", c("x","whatever")) 
Error in colsplit(my_var_1, split = "_", c("x", "whatever")) : 
    unused argument(s) (split = "_") 

splitcolsplitの引数ではありません。あなたが欲しいの引数はpatternある、またはあなただけの位置マッチングに頼ることができます:私は、ライブラリを使用していたことを追加するのを忘れ

> colsplit(my_var_1, "_", c("x","whatever")) 
    x whatever 
1 x00 aaa_123 
2 x00 bbb_123 
3 x00 ccc_123 
4 x01 aaa_123 
5 x01 bbb_123 
6 x01 ccc_123 
7 x02 aaa_123 
8 x02 bbb_123 
9 x02 ccc_123 
+0

(再構築します)。 "split"は、少なくとも最近のバージョンでは、形の変更の引数です:http://www.inside-r.org/packages/cran/reshape/docs/colsplit – Angelo

+0

私はあなたと私とは異なるバージョンを使用していると思います! – Angelo

+1

@Angelo:ああ、答えは「いいえ」です。 'reshape2 :: colsplit'、または[この回答](http://stackoverflow.com/a/8300246/271616)で提供したソリューションを使用する必要があります。 –