2017-09-02 4 views
2

問題はかなり単純です。何らかの理由で、私は単純な解決策を考えることができません。オンラインで見つけることはできません。どのようにすることができ因子レベルの要素を置換する

Time 
8:10 
8:15 
8:30 
8:45 
8:10 
8:15 
8:45 

を:私は結果はこのようになります8、10ですべてのレベルを変換したい

Time 
8:10 
8:15 
8:30 
8:45 
10:10 
10:15 
10:45 

:これは、変数が要因である私のデータであると仮定しましょうこれを行う?

@Rui Barradasが示唆したように
+1

は一つの方法です。これは '10'で始まった以前のレベルを削除することに注意してください。 –

+0

私は ':'を追加して分を置き換えるのではなく、時間を置き換えるべきでしょうか?ちょうど二重チェック。 – user2105555

+1

いいえ、そのまま試してください。また、最初のコメントで言及したレベルを落としたくない場合は 'sub(。)'だけを使用し、 'factor'をその周りに囲まないでください。 –

答えて

2

、あなたはこれを行うことができます。

Time <- as.factor(c(
"8:10", 
"8:15", 
"8:30", 
"8:45", 
"10:10", 
"10:15", 
"10:45" 
)) 

factor(sub("^10", "8", Time)) 
[1] 8:10 8:15 8:30 8:45 8:10 8:15 8:45 
Levels: 8:10 8:15 8:30 8:45 

をあなたの質問に答えるために:「私は追加する必要があります:?右、ない分、時間を交換します」 - いいえ、あなたはこれをする必要はありません。サブ引数の '^'は、正規表現内の文字列の開始を意味します。だからこれは時間を選択するだけです。

大規模なデータセットに対してこれをスケールアップする必要がある場合は、@ lmoのアドバイスを受けてより直接的なアプローチをとることができます。参照:

levels(Time) <- sub("^10", "8", Time) 

時間の比較: `時間< - 因子(サブ( "^ 10"、 "8"、時間))`:ここ

require(microbenchmark) 
microbenchmark(factor(sub("^10", "8", Time)), 
       levels(Time) <- sub("^10", "8", Time)) 

Unit: microseconds 
           expr min  lq  mean median 
     factor(sub("^10", "8", Time)) 56.254 57.9945 77.58347 58.6855 
levels(Time) <- sub("^10", "8", Time) 27.932 28.9770 32.59209 30.4035 
+1

これはfactorレベル、 'levels(Time)< - sub("^10 "、" 8 "、Time)'で直接行うこともできます。この例では、効率の面で問題はありませんが、ベクトルが大きく、繰り返し値が多い場合は、レベルでの操作が大幅に高速になることは間違いありません。正規表現関数はこれを自動的に行うために十分スマートである可能性もあります。 – lmo

関連する問題