2012-12-09 79 views
5

我有一個按帳戶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 
+1

你是說你想要銷售非零的ID的條目子集中的那一行索引?因爲只有你爲這個表子集,87的4纔是9,否則就是9(從上數)。 –

+0

是的,這是正確的。我還沒有完全想到如何,但與plyr和ggplot,我有工作的ID子集的願景,有效地計算和顯示平均增長統計。 – user1100825

回答

6

這會幫助:

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)) 
+0

我編輯並用列名稱(ID,Sales)替換硬編碼索引(2,3)。使用索引不太健壯。 (想象一下數據來自一個文件,並且有人決定插入一列)。 – flodel

+0

現在,這非常接近@ digEmAll的答案。唯一的區別是,通過使用'head',在ID不是非零的情況下,最終會得到一個列表,而他仍然會得到一個向量,但是具有「NA」。 – flodel

+0

非常感謝@flodel。我想我們幾乎同時回答了...... :-)感謝編輯。在R控制檯上進行復制時,我應該更加小心。 –

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 
+0

謝謝。這看起來有希望!我會給它一個旋轉。 – user1100825

1

構建上digEmAll答案,使用functional編程解決方案(也許有點清潔劑):

> res3 <- tapply(
    1:nrow(df) 
    , df$ID 
    , function(Idx) Idx[Position(function(x) df[x, "Sales"] > 0, Idx)] 
) 
> identical(res3, res2) 
[1] TRUE 
相關問題