PROC IML - 矩阵作为频率交叉表

时间:2013-01-20 19:46:25

标签: sas crosstab

我需要使用PROC IML准备一个交叉表(我知道在这种情况下使用PROC FREQ更常见,但这是针对学校项目的,他们强迫我们使用IML)。

数据集如下:

ORANGE
B APPLE
C ORANGE
B MANGO
B APPLE

输出应该有列中的ORANGE APPLE MANGO,行中的A B C和矩阵中的频率,基本上:

ORANGE APPLE MANGO
A 1 0 0
B 0 2 1
C 1 0 0

已编辑添加:

我正在接近解决方案,但在选择符合特定条件的行时仍然存在一些问题 - “(...)”代码中。您可以在下面找到我的想法:

PROC IML;
USE work.data;
    read all var {fruits } into fruits;
    read all var {names} into names;
    read all var {fruits names} into matrix;
close;
u1 = unique(fruits);
u2 = unique(names);
s = j(ncol(u2),ncol(u1),0);
do  i=1 to ncol(u1);
do  z=1 to ncol(u2);
    idx=loc(…);
s[z,i]=countn(idx);
end;
end;
print s;

1 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。因为它是一个课程,我会提供提示而不是提供完整的解决方案。

1)第一种方法是一起使用UNIQUE功能和LOC功能。这种所谓的“UNIQUE-LOC技术”对于使用类别进行计算非常有用。一维示例显示在文章“The UNIQUE-LOC trick”中。我会留给你把它推广到一个交叉表。

2)第二种方法是同时使用SORT和UNIQUEBY功能。第二种技术在文章“An efficient alternative to the UNIQUE-LOC technique中有所描述”。同样,我将留给您阅读文章,并弄清楚如何将其应用到您的课堂项目。

我还可以告诉你哪种解决方案更容易......但我会让你做出决定。

祝你好运!