2012-02-15 18 views
2

私のデータフレームの列を別のものに変換したい。条件関数

私は「月の日」という名前の列を持ち、例えば7,15、または27の値を持つことができます。私はこれらの日を彼らが対応している週に変換したい。正確

  • 日< 7は、第1週から

  • 日> = & < 14 7は、2週からである

  • 日> = 14 & < 21であります3週以降であり、

  • 日> = & < 31 21私はサンプルが採取された日の週番号を与え、私のデータフレームに新しい列を追加したい週4

からです。

例:

dayofthemonth, sample, week 
5, 0.35, 1 
14, 0.5, 3 
27, 0.74, 4 
[...] 

私は「もし」機能を試してみましたが、条件が代わりに単一の値のベクトルに適用されたときに動作するようには思えません。

+0

以下のソリューションはベクトル化されているようですが、将来if-ish関数を使用する必要がある場合は、ifelseを試してみてください。 –

+0

最後の仕様で4週目(> = 21&<31)にエラーがありますか? –

答えて

3

データフレームがdfとしましょう。あなたはその後

df$week <- floor(df$dayofthemonth/7) + 1 

を使用することができ万全を期すために、ここで最後の条件を満たしている(ifelseなし)別のアプローチは、次のとおりです。

df$week[ which(df$week) > 4 ] <- 4 
+1

それは魅力のように機能します!ありがとう! –

+1

実際には、これは<7ではなく7週目に7回あります。 'floor'の解決策が動作するか、' 'df $ dayofthemonthhem /%7 + 1'を試してください – Aaron

+0

ありがとう、@アーロン。私はもともとそれを書いていたが、私の論理がはずれていると思った。編集する前に質問を再読してください。 – bnjmn

1

あなたのデータフレームがd呼び出された場合:

d$week = floor(d$dayofthemonth/7) + 1 
+0

もう一度ありがとうございます! –

0

フロアを使用して希望の結果を得る方法が他にもありますが、より具体的には、ifのプログラムフローは、論理値であり、実行するコードのブロックを選択することを意図しています。 ifelse関数は論理値と2つの他のベクター(FALSEの場合はTRUE 1のための1)のベクトルを取り、論理ベクトルに基づいて2つのベクトルをインターリーブので、あなたの質問のためのifelseを使用して一つの選択肢は次のようになります:

d$week <- ifelse(d$dayofthemonth < 7, 1, 
    ifelse(d$dayofthemonth < 14, 2, 
    ifelse(d$dayofthemonth < 21, 3, 4))) 

findInterval関数もifelseより簡単かもしれない別のアプローチで見てください。また、異なる幅の間隔も使用できます。