令我失望的是,以下代码总结了“价值”。从主人那周开始#39;出现在'交易中的几个星期'不起作用 -
data master;
input week value;
datalines;
1 10
1 20
1 30
2 40
2 40
2 50
3 15
3 25
3 35
;
run;
data transaction;
input change_week ;
datalines;
1
3
;
run;
data _null_;
set transaction;
do until(done);
set master end=done;
where week=change_week;
sum = sum(value, sum);
end;
file print;
put week= sum=;
run;
SAS抱怨说,因为它没有看到“改变周刊”。在掌握,不知道如何操作。
在给定事务数据集的情况下,必定有一种方法可以对主集的子集进行某些操作(当然,适当的索引)...有人知道吗?
答案 0 :(得分:1)
我相信这是对提问者所要求的最接近的答案。
此方法在大型数据集上使用week
上的索引,允许在事务数据集中存在无效week
值,并且无需按任何特定顺序对数据集进行排序。如果主数据集按周顺序,性能可能会更好。
对于小型交易数据集,这应该比其他解决方案执行得更好,因为它只从主数据集中检索所需的观察结果。如果您正在处理>由于使用索引的开销,Quentin方法在单个事务数据集中的主数据集中约有30%的记录有时可能表现更好。
data master(index = (week));
input week value;
datalines;
1 10
1 20
1 30
2 40
2 40
2 50
3 15
3 25
3 35
;
run;
data transaction;
input week ;
datalines;
1
3
4
;
run;
data _null_;
set transaction;
file print;
do until(done);
set master key = week end=done;
/*Prevent implicit retain from previous row if the key isn't found,
or we've read past the last record for the current key*/
if _IORC_ ne 0 then do;
_ERROR_ = 0;
call missing(value);
end;
else sum = sum(value, sum);
end;
put week= sum=;
run;
N.B。为此,主数据集中的索引变量必须与事务数据集中的变量具有完全相同的名称和类型。此外,索引必须是非唯一的,以便容纳具有相同键值的多行。
此外,如果要直接应用事务更改,即无需SAS生成大量临时文件并替换原始文件,则可以使用等效的set master...
语句替换modify master...
语句。
答案 1 :(得分:0)
你是对的,在SAS中有很多方法可以做到这一点。你的例子是低效的,因为(一旦我们开始工作)它仍然需要完整阅读" master"永远的"交易"。
(您收到错误的原因是因为您使用了where
而不是if
。在SAS中,数据步骤中的子设置where
只知道已存在的列在数据集中它的子设置。它们保留两个选项,因为where
在可用时更快。)
另一种解决方案是使用proc sql
。希望这个例子不言自明:
proc sql;
select
a.change_week,
sum(b.value) as value
from
transaction as a,
master as b
where a.change_week = b.week
group by change_week;
quit;