Plot 用GROUP命令处理SQL非常慢。为什么?可能的解决方法?

Plot 用GROUP命令处理SQL非常慢。为什么?可能的解决方法?,plot,sas,sas-macro,Plot,Sas,Sas Macro,我有一个宏,它取一个数据集D,并基本上输出k个不相交的数据集,D_1,…,D_k。k值不是固定的,取决于事先未知的数据属性。不过,我们可以假设k不大于10 数据集D包含变量x和y,我想将每个D_I的x和y的线/散点图相互叠加。在我的特殊情况下,x是时间,我希望看到每个D_I的输出y,并将它们相互比较 希望这是清楚的 我该怎么做?我事先不知道k,所以我需要某种%do循环。但我似乎无法在“proc sgplot”中设置do循环 我可能能够制作一个包含很长一系列命令的宏,但我不确定 如何在SAS中覆盖

我有一个宏,它取一个数据集D,并基本上输出k个不相交的数据集,D_1,…,D_k。k值不是固定的,取决于事先未知的数据属性。不过,我们可以假设k不大于10

数据集D包含变量x和y,我想将每个D_I的x和y的线/散点图相互叠加。在我的特殊情况下,x是时间,我希望看到每个D_I的输出y,并将它们相互比较

希望这是清楚的

我该怎么做?我事先不知道k,所以我需要某种%do循环。但我似乎无法在“proc sgplot”中设置do循环

我可能能够制作一个包含很长一系列命令的宏,但我不确定

如何在SAS中覆盖这些绘图

EDIT:我将试图避免使用GROUP子句进行PROC SGPLOT的原因包括在内,以供参考。我尝试了下面的代码,计算时间超过了30分钟(之后我取消了计算,所以我不知道实际需要多长时间)。procsql运行非常快,程序卡在procsgplot上

    proc sql;
    create table dataset as select    
        date, product_code, sum(num_of_records) as total_rec
        from &filename
            group by product_code, data
                order by product_code, date
    ;
quit;

PROC SGPLOT Data = dataset;
    scatter x = date   y = total_rec/group=product_code;
    title "Total records by product code";
run;

文件中的观测值数量为76000000

您应该更改宏以生成一个数据集,其中包含一个变量
di
(或任何您可以逻辑命名的变量),该变量用于标识该数据集将要访问的数据集(或使用任何确定该数据集将要访问的数据集的变量来标识该数据集),或者使用宏后组合数据集

然后,您可以使用
group
覆盖绘图。例如:

data my_data;
  call streaminit(7);
  do d_i = 1 to 5;
    y = 10;    
    x = 0;
    output;
    do x = 1 to 10;
      y + round(rand('Uniform')*3,.1)-1.5;
      output;
    end;
  end;
run;

proc sgplot data=my_data;
  series x=x y=y/group=d_i;
run;

您应该做的是更改宏以生成一个数据集,其中包含一个变量
d_i
(或您可以从逻辑上对其命名的任何变量),该变量用于标识它将要访问的数据集(或使用确定它将要访问的数据集的任何变量来标识它),或者使用宏后组合数据集

然后,您可以使用
group
覆盖绘图。例如:

data my_data;
  call streaminit(7);
  do d_i = 1 to 5;
    y = 10;    
    x = 0;
    output;
    do x = 1 to 10;
      y + round(rand('Uniform')*3,.1)-1.5;
      output;
    end;
  end;
run;

proc sgplot data=my_data;
  series x=x y=y/group=d_i;
run;

我这样做的全部原因是因为我的数据集太大,以至于使用Group绘图花费的时间太长。Proc sql是一种对数据进行排序并将其单独绘制的更快的方法。我不能撤消投票,我只能向上投票。我不确定你是否回答了我的问题。我有一个庞大的数据集(我在一家大公司工作)。我不知道为什么,但是带有group命令的proc sgplot需要一个小时才能完成。另一方面,通过相同的分组在sql中拆分数据集非常快。我想利用这一点。这是我的问题。无论如何,我认为这是你在SAS中得到的唯一答案。R的加法绘图没有一个功能分析(即,您可以
plot
一个向量,然后
plot
另一个向量,并将它们添加到同一个图表中)。所有内容都需要在同一个数据集中。我认为,即使有一种方法可以做到这一点(从不同的数据集中绘制多个相互重叠的图),这也是最快的方法,因为它只需要一个开口。你能在这里补充一下尺寸的细节吗?我想这对你的问题很重要。而您当前使用的代码需要一个小时(或其他一些非常复杂的事情)。如果可以的话,像我上面做的那样制作一个示例数据集-可能最简单的方法是像我一样只制作一个带有by group标记的数据集,然后任何生成多个数据集的解决方案都可以在此基础上进行拆分。速度的慢度取决于SAS如何向图形添加点以及呈现它的Java功能。您经常会看到SAS程序会因此限制绘制的点数。最好的方法是从数据中采样值并绘制样本。我这样做的全部原因是因为我的数据集太大了,使用Group进行绘图花费的时间太长了。Proc sql是一种对数据进行排序并将其单独绘制的更快的方法。我不能撤消投票,我只能向上投票。我不确定你是否回答了我的问题。我有一个庞大的数据集(我在一家大公司工作)。我不知道为什么,但是带有group命令的proc sgplot需要一个小时才能完成。另一方面,通过相同的分组在sql中拆分数据集非常快。我想利用这一点。这是我的问题。无论如何,我认为这是你在SAS中得到的唯一答案。R的加法绘图没有一个功能分析(即,您可以
plot
一个向量,然后
plot
另一个向量,并将它们添加到同一个图表中)。所有内容都需要在同一个数据集中。我认为,即使有一种方法可以做到这一点(从不同的数据集中绘制多个相互重叠的图),这也是最快的方法,因为它只需要一个开口。你能在这里补充一下尺寸的细节吗?我想这对你的问题很重要。而您当前使用的代码需要一个小时(或其他一些非常复杂的事情)。如果可以的话,像我上面做的那样制作一个示例数据集-可能最简单的方法是像我一样只制作一个带有by group标记的数据集,然后任何生成多个数据集的解决方案都可以在此基础上进行拆分。速度的慢度取决于SAS如何向图形添加点以及呈现它的Java功能。您经常会看到SAS程序会因此限制绘制的点数。最好的方法是从数据中采样值并绘制样本。这将为您提供一个具有代表性的图形和较少的绘图点数。您能否举例说明产品代码等的频率?只是
数据mydata;do产品代码=1至10000;do日期=1至7600;(产生合理x y的某种方法);产出;结束;运行或类似的东西。有什么东西可以垫在垫子上