在 SAS 中将数字数组提高到幂
Posted
技术标签:
【中文标题】在 SAS 中将数字数组提高到幂【英文标题】:Raising an array of numbers to a power in SAS 【发布时间】:2015-10-21 19:04:43 【问题描述】:我需要将数组(SAS 数据集中的一列)中的每个数字提高到一定的幂。有人告诉我,在将列的内容写入矩阵之后,这可以在 IML 中完成。然而,一个矩阵显然必须是方阵才能在 IML 中升幂,而且我的数据非常不是方阵。将一列数字求幂的过程和语法是什么?
很抱歉问了这么简单的事情,我对 SAS 还是很陌生。
【问题讨论】:
我知道我应该说“范围”而不是“数组”。 @Stu 下面的回答是正确的。如果您在 IML 中并尝试 Mat**2,那么您正在尝试矩阵乘法(Mat x Mat,或 Mat squared)。你想要一个元素方式,它的运算符是#。所以 Mat##2 将发挥元素的作用。 【参考方案1】:无需道歉。 SAS 是一个非常不同的思维过程,需要大量练习。你问的问题都对。
SAS 是一种迭代语言。您所说的数字数组听起来像是数据集中的许多单独的观察结果。 SAS 在每个数据集中一次对一行的值执行操作,然后在到达数据步骤的底部时移动到下一行。
假设您的数据集如下所示:
var
1
2
3
4
如果您想对每个数字求平方,您可以创建一个新变量(或者您可以覆盖当前变量,您可以选择)并使用**
指数运算符。
data want;
set have;
var_squared = var**2;
run;
在这一步中,SAS 创建一个数据集want
,读取数据集have
,创建一个名为var_squared
的长度为8 的新数值变量,为其分配一个值var*var
,然后输出。它对每一行重复读取-计算-写入循环,直到它到达文件标记的末尾。请注意,output
是自动隐含的。当您不指定output
时,SAS 将在命中run
时自动写入新数据集。
您的新数据集将如下所示:
var var_squared
1 1
2 4
3 9
4 16
【讨论】:
谢谢!我会尝试这样做,看看会发生什么。【参考方案2】:正如您所发现的,与熟悉的标量运算相比,SAS/IML 语言提供了更多类型的乘法和“升幂”运算。你可以阅读different ways to multiply in the SAS/IML language.
对于大多数操作,SAS/IML 语言区分elementwise operations and vector or matrix operations。对于您的用例,您应该使用元素幂运算符 (##),它将向量或矩阵的每个元素提升到幂。例如,要计算数据集中每个学生身高的平方,您可以使用:
proc iml;
use sashelp.class;
read all var "Height";
close sashelp.class;
sqHt = Height##2; /* raise each element to 2nd power */
print Height sqHt;
【讨论】:
【参考方案3】:谢谢!我使用了 elementwise 运算符,它起作用了(这次软件没有反对),尽管出现了另一个问题(关于这个问题,我将在一个单独的问题中提出)。
【讨论】:
以上是关于在 SAS 中将数字数组提高到幂的主要内容,如果未能解决你的问题,请参考以下文章