6

アカウント ID ごとの売上の時系列があります。平均成長率を計算するには、各 ID の売上がゼロ以外の最初の月を抽出する必要があります。アカウントはさまざまな時点で確立されている可能性があるため、アカウントで初めて売上が 0 を超える時期を動的に特定する必要があります。

成長を計算する関数に渡すには、行へのインデックスで十分です。したがって、アカウント ID ごとに次の結果が期待されます。

54 - [1]
87 - [4]
95 - [2]

I tried `apply(df$Sales,2,match,x>0)`  but this doesn't work.

ポインタはありますか?あるいは、このデータセットで CAGR を計算する簡単な方法はありますか?

前もって感謝します!

CalendarMonth   ID  Sales
8/1/2008    54  6692.60274
9/1/2008    54  6476.712329
10/1/2008   54  6692.60274
11/1/2008   54  6476.712329
12/1/2008   54  11098.60822
7/1/2008    87  0
8/1/2008    87  0
9/1/2008    87  0
10/1/2008   87  18617.94155
11/1/2008   87  18017.36279
12/1/2008   87  18617.94155
1/1/2009    87  18617.94155
2/1/2009    87  16816.20527
7/1/2008    95  0
8/1/2008    95  8015.956284
9/1/2008    95  0
10/1/2008   95  8015.956284
11/1/2008   95  6309.447514
12/1/2008   95  6519.762431
1/1/2009    95  6519.762431
4

3 に答える 3

9

これは役に立ちますか:

tapply(df$Sales, df$ID, function(a)head(which(a>0),1))

dfあなたのデータフレームはどこにありますか?

インデックスだけでなく行全体が必要な場合は、これが役立つ場合があります。

lapply(unique(df$ID),function(a) head(subset(df,ID==a & Sales>0),1))
于 2012-12-09T10:38:13.420 に答える
3

考えられる解決策は次のとおりです。

res1 <- tapply(df$Sales,INDEX=df$ID,FUN=function(x) which(x > 0)[1])

> res1
54 87 95 
 1  4  2 

resは次の数値ベクトルです。

> names(res)
[1] "54" "87" "95"

data.frameサブセットではなく元の行のインデックスを取得する場合は、次のようにします。

res2 <- tapply(1:nrow(df),
              INDEX=df$ID,FUN=function(idxs) idxs[df[idxs,'Sales'] > 0][1])

> res2
54 87 95 
 1  9 15 

次に、 のインデックスを単純に使用してres2、以下をサブセット化できdata.frameます。

df2 <- df[res2,]

> df2 
CalendarMonth   ID      Sales
  8/1/2008      54     6692.603
 10/1/2008      87    18617.942
  8/1/2008      95     8015.956
于 2012-12-09T10:36:14.570 に答える
1

関数型プログラミングを使用したソリューションであるdigEmAllの回答を構築します(おそらく少しきれいです):

> res3 <- tapply(
  1:nrow(df)
  , df$ID
  , function(Idx) Idx[Position(function(x) df[x, "Sales"] > 0, Idx)]
)
> identical(res3, res2)
[1] TRUE
于 2012-12-09T21:00:26.010 に答える