我有一个按帐户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
答案 0 :(得分:7)
这会有所帮助:
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))
答案 1 :(得分: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
答案 2 :(得分: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