在 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 中将数字数组提高到幂的主要内容,如果未能解决你的问题,请参考以下文章

将数字提高到幂;重复的话

将输入数字提高到幂;重复的话;输入单词

如何在C ++中将字节数组中的整数转换为数字

在javascript中将数字转换为数组| angular7的打字稿[重复]

如何在JavaScript中将数组数组拆分为单个数字?

如何在 C++ 中将数字字符串拆分为数组? [复制]