我需要使用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;
答案 0 :(得分:3)
有几种方法可以做到这一点。因为它是一个课程,我会提供提示而不是提供完整的解决方案。
1)第一种方法是一起使用UNIQUE功能和LOC功能。这种所谓的“UNIQUE-LOC技术”对于使用类别进行计算非常有用。一维示例显示在文章“The UNIQUE-LOC trick”中。我会留给你把它推广到一个交叉表。
2)第二种方法是同时使用SORT和UNIQUEBY功能。第二种技术在文章“An efficient alternative to the UNIQUE-LOC technique中有所描述”。同样,我将留给您阅读文章,并弄清楚如何将其应用到您的课堂项目。
我还可以告诉你哪种解决方案更容易......但我会让你做出决定。
祝你好运!