我需要将数组(SAS 数据集中的一列)中的每个数字提高到一定的幂。有人告诉我,在将列的内容写入矩阵之后,这可以在 IML 中完成。然而,一个矩阵显然必须是方阵才能在 IML 中升幂,而且我的数据非常不是方阵。将一列数字求幂的过程和语法是什么?
很抱歉问这么简单的事情,我对 SAS 很陌生。
没必要道歉。SAS 是一个非常不同的思维过程,需要大量练习。你问了所有正确的问题。
SAS 是一种迭代语言。您所说的数字数组听起来像是数据集中的许多单独的观察结果。SAS 在每个数据集中一次对一行的值执行操作,然后在到达数据步骤的底部时移动到下一行。
假设您的数据集如下所示:
var
1
2
3
4
如果您想对每个数字求平方,您将创建一个新变量(或者您可以覆盖当前变量,您可以选择)并使用**
指数运算符。
data want;
set have;
var_squared = var**2;
run;
在这一步中,SAS 创建一个数据集want
,读取数据集have
,创建一个长度为 8 的新数值变量,命名为var_squared
,为其赋值var*var
,然后输出。它对每一行重复读取-计算-写入循环,直到它到达文件标记的末尾。请注意,这output
是自动暗示的。如果不指定output
,SAS 将在命中后自动写入新数据集run
。
您的新数据集将如下所示:
var var_squared
1 1
2 4
3 9
4 16
正如您所发现的,与熟悉的标量运算相比,SAS/IML 语言提供了更多类型的乘法和“升幂”运算。您可以阅读SAS/IML 语言中的不同乘法方法。
对于大多数操作,SAS/IML 语言区分元素操作和向量或矩阵操作。对于您的用例,您应该使用元素幂运算符 (##),它将向量或矩阵的每个元素提升到幂。例如,要计算数据集中每个学生身高的平方,您可以使用:
proc iml;
use sashelp.class;
read all var {"Height"};
close sashelp.class;
sqHt = Height##2; /* raise each element to 2nd power */
print Height sqHt;
谢谢!我使用了 elementwise 运算符,它起作用了(这次软件没有反对),尽管出现了另一个问题(关于这个问题,我将在一个单独的问题中提出)。