R 删除合并时间序列中的观测值

R 删除合并时间序列中的观测值,r,dataframe,sas,split-apply-combine,R,Dataframe,Sas,Split Apply Combine,我有一个垂直排列的堆叠的时间序列池data.frame,如下所示: date item qty_sold day_1 orange 0 day_2 orange 0 day_3 orange 0 day_4 orange 0 day_5 orange 5 day_6 orange 0 day_7 orange 8 day_8 orange 0 day_1 hammer 0 day_2 hammer 0 day_3 ham

我有一个垂直排列的堆叠的时间序列池data.frame,如下所示:

date    item    qty_sold
day_1   orange  0
day_2   orange  0
day_3   orange  0
day_4   orange  0
day_5   orange  5
day_6   orange  0
day_7   orange  8
day_8   orange  0
day_1   hammer  0
day_2   hammer  0
day_3   hammer  3
day_4   hammer  0
day_5   hammer  70
day_6   hammer  70
day_7   hammer  0
Day_8   hammer  80
在每个项目的子系列/子组中,我需要识别并删除*在观察到第一个正销售数量之前的所有观察*。例如,对于橙色系列,这意味着删除第1天到第4天,对于hammer系列,这意味着删除前2天

如果上述解释不清楚: 从数据集中的每个子系列中,我需要删除从date=Day_1到date=Day_k的所有天数,以便在间隔1…k qty_Seld=0的每一天中,保留date=Day_k+1 qty_Seld>=0的所有行


有人能告诉我怎么做吗?实际数据集包含大约一百万行。除了R之外,我还欢迎使用SAS实现这一点的建议。

我完全同意@joran的观点。即使这个问题没有显示出任何研究成果,我还是会在这里给出一个R的答案。将来,请向我们展示您也尝试过的代码

对于您的问题,要做的第一步是使用一个基本函数或一个很好的包,它将帮助您拆分数据。frame到组,对每个拆分组应用您想要应用的任何函数,并合并通常称为“拆分应用合并策略”的结果。有两个很好的外部包,即plyr和data.table。尽管如此,我还是更喜欢data.table进行data.frame类操作,因为它通常要快得多

首先,我们将把data.frame转换为data.table。如果未安装此软件包,则可以通过执行install.packagesdata.table来完成

总而言之:

require(data.table)
dt <- data.table(df)
dt[, .SD[cummax(qty_sold)>0], by = item]
关于语法的更多解释。让我们先考虑=项目。这是按项目对数据进行内部拆分的部分,即首先考虑项目=橙色的整个data.table,然后是项目=hammer等的部分

SD的中间部分[cummaxqty\u sell>0]是魔术发生的地方-应用函数等价物。这里,.SD只是与一次一个项目对应的分割部分。要想每次都更清楚地看到.SD中的内容,请执行:dt[,print.SD,by=item]


这将基本上删除刚开始时具有连续0的行,并保留所有其他内容只要没有负值,解决方案就有保证。

SAS方法类似于:在保留变量中跟踪项目是否已遇到正值。如果不是,则不输出。如果是,请在用于跟踪它的变量中记录它。在项目的最后一行之后,重置跟踪变量。 例如:必要时进行排序

data RESULT (drop=found_first_positive);
    set DATASET;
    by item date;
    retain found_first_positive 0;
    if quantity>0 then found_first_positive=1;
    if found_first_positive;
    if last.item then found_first_positive=0;
run;

StackOverflow通常用于帮助处理您已经编写但无法工作的代码。我们通常不喜欢简单描述问题和请求代码的Q。@joran-除非它被标记。。。在这种情况下,开火!谢谢你的回复。我不熟悉这里的规则,不幸的是,我对R的了解太有限,无法尝试自己的解决方案。正如joran指出的,不幸的是,这个网站不适合这些问题。所以,你会被否决,最终人们会停止回答你的问题,除非他们看到你做出了努力。所以我建议你买一本R系列的书,当你在解释你所做的事情和你的困境时,开始阅读并发表文章。
require(data.table)
dt <- data.table(df)
dt[, .SD[cummax(qty_sold)>0], by = item]
data RESULT (drop=found_first_positive);
    set DATASET;
    by item date;
    retain found_first_positive 0;
    if quantity>0 then found_first_positive=1;
    if found_first_positive;
    if last.item then found_first_positive=0;
run;