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

Sas PROC IML-矩阵作为频率交叉表,sas,crosstab,Sas,Crosstab,我需要使用PROC-IML准备一个交叉表(我知道在这种情况下使用PROC-FREQ更常见,但这是为了学校项目,他们强迫我们使用IML) 数据集看起来像: 桔子 B苹果 C橙色 B芒果 B苹果 输出应该有列中的橙色苹果芒果,行中的A B C和矩阵中的频率,基本上: 橙苹果芒果 A 10 0 b21 C1 0 0 编辑以添加: 我正在接近解决方案,但在选择符合特定条件的行时仍然存在一些问题-“(…)”在代码中。下面你可以找到我的想法: PROC IML; USE work.data; rea

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

数据集看起来像:

桔子
B苹果
C橙色
B芒果
B苹果

输出应该有列中的橙色苹果芒果,行中的A B C和矩阵中的频率,基本上:

橙苹果芒果
A 10 0
b21
C1 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) 第一种方法是将UNIQUE函数和LOC函数一起使用。这种所谓的“UNIQUE-LOC技术”对于使用类别进行计算非常有用。文章中显示了一个一维示例。“我将把它留给您,让您将其概括为交叉表

2) 第二种方法是同时使用SORT和UNIQUEBY函数。这第二种技巧在文章中有描述。“同样,我将留给您阅读文章,并找出如何将其应用于您的课堂项目

我也可以告诉你哪种解决方案更简单……但我会让你做出决定


祝你好运

亲爱的瑞克,谢谢你的回答。仍然无法达成最终的解决方案,但我有一些代码,可能会让我更接近。如果你能帮我,也许再给我一点建议,我会非常感激。我的第二个提示是UNIQUEBY更容易!独特的/LOC解决方案需要大量簿记。几点提示。首先,您不想使用COUNTN,而是NCOL。NCOL(矩阵)在矩阵为空时工作。COUNTN没有。明白为什么吗?其次,您希望使用LOC来标识矩阵中的哪些行与水果和名称的当前值相匹配。要在LOC上使用两个值的组合,请使用&;例如,loc(matrix[,1]=“APPLES”&&matrix[,2]=“A”)将标识为“APPLES”和“A”的行(当然没有,但没关系)。