寻找使用PROC SQL计算跨多个列/变量的不同条目的方法,我所遇到的是如何计算值的组合。 但是,我想搜索2个(字符)列(在符合特定条件的行中)并计算出现在任何中的不同值的数量。
考虑一个如下所示的数据集:
DATA have;
INPUT A_ID C C_ID1 $ C_ID2 $;
DATALINES;
1 1 abc .
2 0 . .
3 1 efg abc
4 0 . .
5 1 abc kli
6 1 hij .
;
RUN;
我现在想要一个包含nr计数的表。在 C = 1的行中 C_ID1 和 C_ID2 中的唯一值。 结果应为4(abc,efg,hij,kli):
nr_distinct_C_IDs
4
到目前为止,我只能处理一列( C_ID1 ):
PROC SQL;
CREATE TABLE try AS
SELECT
COUNT (DISTINCT
(CASE WHEN C=1 THEN C_ID1 ELSE ' ' END)) AS nr_distinct_C_IDs
FROM have;
QUIT;
(请注意,我使用CASE处理而不是WHERE子句,因为我的实际PROC SQL也处理同一查询中的其他情况。)
这给了我:
nr_distinct_C_IDs
3
如何将此扩展为两个变量(在我的示例中为 C_ID1 和 C_ID2 )?
答案 0 :(得分:0)
我认为在这种情况下,如果您的优先级是想出一些容易扩展到大量变量的东西,那么数据步骤可能更合适。 E.g。
data _null_;
length ID $3;
declare hash h();
rc = h.definekey('ID');
rc = h.definedone();
array IDs $ C_ID1-C_ID2;
do until(eof);
set have(where = (C = 1)) end = eof;
do i = 1 to dim(IDs);
if not(missing(IDs[i])) then do;
ID = IDs[i];
rc = h.add();
if rc = 0 then COUNT + 1;
end;
end;
end;
put "Total distinct values found: " COUNT;
run;
这里需要做的就是容纳另一个变量,就是将它添加到数组中。
N.B。因为这使用了一个哈希对象,你需要足够的内存来保存你期望找到的所有不同的值。另一方面,它只读取输入数据集一次,不需要排序,因此它可能比需要多次内部读取和排序的SQL方法更快。