代替

2016-07-09 14 views
2

私は、次のデータフレーム代替

structure(list(FY = c("2015-2016", "2015-2016", "2015-2016", 
"2015-2016"), YEARMN = structure(c(2015.25, 2015.25, 2015.25, 
2015.25), class = "yearmon"), BRAND = c("3M CAR CARE", "CAR CARE 3M", 
"CAR CARE 3M", "CAR CARE 3M"), variable = structure(c(1L, 
2L, 3L, 4L), .Label = c("IstWEEKRent", "IIndWEEKRent", "IIIrdWEEKRent", 
"IVthWEEKRent", "mymonth"), class = "factor"), value = c("0", 
"17500", "85000", "212500"), mymonth = c("Apr", "Apr", "Apr", 
"Apr")), .Names = c("FY", "YEARMN", "BRAND", "variable", "value", 
"mymonth"), row.names = c(NA, 4L), class = "data.frame") 

を持っているが、実際のデータフレームは次のようになります。

  FY YEARMN  BRAND  variable value mymonth 
1 2015-2016 Apr 2015 3M CAR CARE IstWEEKRent  0  Apr 
2 2015-2016 Apr 2015 CAR CARE 3M IIndWEEKRent 17500  Apr 
3 2015-2016 Apr 2015 CAR CARE 3M IIIrdWEEKRent 85000  Apr 
4 2015-2016 Apr 2015 CAR CARE 3M IVthWEEKRent 212500  Apr 

私の月の欄には、4月から数ヶ月を持っています3月に...そして毎月、私のデータセットに4週間あります。これは変数columnに与えられています。私は週に私はこれを成し遂げるためにifelse機能を使用する条件

variable == "IstWeekRent" & mymonth == "Apr" 

に一致する番号1を与えたいと思う1から48までの開始、マル... - 私は年度4月のために週番号を作成しようとしていますこれは正常に動作します...しかし、私は私の光沢のあるアプリケーションに同じが含まれている場合、私は、次のエラーを取得しています:

Error in parse(file, keep.source = FALSE, srcfile = src, encoding = enc) : 
    contextstack overflow at line 2870 

私の現在のifelse条件文は次のようになります。

trndR$weeks <- ifelse(trndR$mymonth == "Apr" & trndR$variable == "IstWEEKRent", 1, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IIndWEEKRent", 2, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IIIrdWEEKRent", 3, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IVthWEEKRent", 4, 
       ifelse(trndR$mymonth == "May" & trndR$variable == "IstWEEKRent", 5, 
       ifelse(trndR$mymonth == "May" & trndR$variable == "IIndWEEKRent", 6, 

trndRは私のdfの名前であり、条件は48まで拡張されます。

私はifelse条件を50個まで入れ子にすることができると考えました...しかし、これを修正する方法はあまりよく分かりません。私は適用機能について読んでいますが、この場合の使用方法はわかりません。

+0

データはソートされていますか?表示されたデータは、1週間に一貫した行があるように見えます。この場合、 'weeks'カラムの行数で十分でしょう。 – rosscova

答えて

2

1)試用:

質問に投稿されたこの使用 trndR与え
mos <- month.abb[c(4:12, 1:3)] # Apr, May, ...., Dec, Jan, Feb, Mar 
transform(trndR, weeks = 4 * (match(mymonth, mos)-1) + as.numeric(variable)) 

:行がソートされ、不足している週があってもされていない場合でも、これは動作するはず

  FY YEARMN  BRAND  variable value mymonth weeks 
1 2015-2016 2015.25 3M CAR CARE IstWEEKRent  0  Apr  1 
2 2015-2016 2015.25 CAR CARE 3M IIndWEEKRent 17500  Apr  2 
3 2015-2016 2015.25 CAR CARE 3M IIIrdWEEKRent 85000  Apr  3 
4 2015-2016 2015.25 CAR CARE 3M IVthWEEKRent 212500  Apr  4 

1A)この代替が短く(一行だけ)おそらくとして明確ではない:行がソートされ、ミッシング週間がないされている場合、こののように働くだろう

transform(trndR, weeks = 4*((match(mymonth, month.abb)-4) %% 12) + as.numeric(variable)) 

2)よく

transform(trndR, weeks = 1:nrow(trndR)) 
+0

'as.numeric'はどのように文字列を数値に変換しますか?私はそれが可能かもしれないと思うが、私はそれを得ることができない(ちょうどその変換)私のために働く。 – rosscova

+0

彼らは文字ではありません - 彼らは要因です。 'str(trndR)'を試してください –

+0

ああ、私はそれに気付かなかった!問題をずっと簡単にする!ありがとう。 – rosscova

1

データの外観から、すべてが正しい順序であることを確認してから、各行を特定の週に呼び出すことができます。例えば、(G.Grothendieckがvariable列が要因であることを私に指摘した後、彼らの答えは私よりもっと整頓ようだが、私はそれがどんな関心がある場合には、とにかくここにこれを残しておきますわずかに編集):

# get a value from 1 to 4, representing the `variable` column numerically 
trndR$weeks <- as.numeric(trndR$variable) 

# now sort the dataframe by `YEARMN` and `weeks` respectively to make sure everything is in order 
trndR <- trndR[ with(trndR, order(YEARMN, weeks)), ] 

# and replace that new `weeks` column with a sequence 
trndR$weeks <- seq_along(trndR$weeks) 

あなたのデータは1つの金融年間含まように見えますが、ない場合は、あなたが(各年度が完全にあなたのデータセットで表現されると仮定した場合)会計年度ごとにそれを適用するには、上記の最後の行を書き換えることができます:

library(data.table) 
setDT(trndR)[ , weeks := seq_len(48), by = FY ] 
+0

多くのおかげで....私はあなたのソリューションを試してみました...しかし、seq_alongは1週から1256までの連続番号で列の週を埋めました...私は1から48までの範囲の週番号を探していました(4週間を1ヶ月と見なしています)。再び多くのおかげで...あなたのソリューションは確かに私は別の解決策を知って助けた.....私は昨日以来これと苦労していた。私はifelseを適用する前にFYでサブセット化していました。 – Apricot

+1

最後のセクション( 'data.table'を使って)を使いましたか?それはあなたが話している長いシーケンスを避けるべきです。とにかく、私はあなたが解決策を見つけてうれしいです。 – rosscova