【问题标题】:deleting observations in pooled time series [closed]删除汇总时间序列中的观察结果[关闭]
【发布时间】:2013-07-06 22:28:15
【问题描述】:

我有一个垂直排列(堆叠)的池化时间序列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

在每个“项目的”子系列/子组中,我需要识别并删除*在观察到第一个正面 qty_sold 的那一天之前的所有观察结果*。例如,对于“orange”系列,这意味着删除第 1 天到第 4 天,对于“hammer”系列,这意味着删除前 2 天。


(如果上面的解释不清楚): 从数据集中的每个子系列中,我需要删除从 date = Day_1 到 date = Day_k 的所有日期,这样对于间隔 1...k qty_sold = 0 中的每一天,并保留 date 所在的所有行= Day_k+1 qty_sold >= 0)

任何人都可以就如何解决这个问题提供一个想法吗?实际数据集包含大约一百万行。除了 R 之外,我也欢迎使用 SAS 完成此任务的建议。

【问题讨论】:

  • StackOverflow 通常用于帮助处理您已经编写过的代码,但无法正常工作。我们通常不希望在您仅描述问题和请求代码的情况下使用 Q。
  • @joran - 除非它被标记为 regex... 在这种情况下,开火吧!

标签: r dataframe sas split-apply-combine


【解决方案1】:

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

对于你的问题,第一步是使用一个基本函数或一个不错的包,它可以帮助你split你的data.frame到组,apply你想应用于每个拆分组的任何函数和combine 结果(通常称为split-apply-combine 策略)。有几个不错的(外部)包,即plyrdata.table。虽然,我更喜欢 data.table 进行类似 data.frame 的操作,因为它通常要快得多。

所以,首先我们会将您的 data.frame 转换为 data.table。如果你没有安装这个包,那么你可以通过install.packages("data.table")来完成。

require(data.table) # load package
dt <- data.table(df) # convert data.frame to data.table

现在,要将data.table 分成组,我们可以在data.table 中使用参数by。而我们的apply 函数将是cummax,因为这只会在第一个连续的零和非零之后给你0(如果你的数据中没有负值,我在这里假设)。然后,自动组合结果。所以,让我们这样做:

dt[, .SD[cummax(qty_sold) > 0], by = item]

      item  date qty_sold
 1: orange day_5        5
 2: orange day_6        0
 3: orange day_7        8
 4: orange day_8        0
 5: hammer day_3        3
 6: hammer day_4        0
 7: hammer day_5       70
 8: hammer day_6       70
 9: hammer day_7        0
10: hammer Day_8       80

总结一下:

require(data.table)
dt <- data.table(df)
dt[, .SD[cummax(qty_sold)>0], by = item]

更多关于语法的解释。让我们首先考虑by = item。这部分在内部splititem 为您提供的数据(即首先考虑item= orange 的整个data.table,然后是item = hammer 的部分等。)。

中间部分 .SD[cummax(qty_sold) &gt; 0] 是魔法发生的地方 - apply 函数等效。在这里,.SD 只是拆分部分(对应于 item 一次取一个。要更清楚地看到 .SD 中的内容,请执行:dt[, print(.SD), by = item]

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

【讨论】:

  • 感谢您的回复。我对这里的规则不熟悉,不幸的是我对 R 的了解太有限,无法尝试自己的解决方案。
  • 正如 joran 所指出的,不幸的是,本网站不适用于此类问题。所以,你会被否决,最终人们会停止回答你的问题(除非他们看到你已经做出了努力)。所以我建议你买一本 R 书,当你在解释你做了什么以及你卡在哪里遇到困难时开始阅读和发布。
【解决方案2】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2017-09-14
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多