0

我有一个数据集,我在 proc-iml 中操作,然后创建一个新的数据集,读取其中的一些操作值。当我读取字符值时,它们的长度从 7 变为 9。

这并没有真正造成问题,除了一点点烦恼,当我稍后合并这个新数据集时,我收到警告说两个数据集中的变量长度不同。

有没有办法保持原始变量的长度?

示例代码

data data1;
infile datalines delimiter=',';

input classif :$9. time :$7.;
datalines;
05, 2021_11
051, 2021_11
;
run;

proc iml;
    use work.data1;
    read all var {classif time } into _temp_1;
    classif = _temp_1[,1];
    time   = _temp_1[,2];
close;
create work.data2 var{classif time};
append; 
quit;

观察 data1 中的时间长度是 7,而 data2 中的时间长度是 9。

4

3 回答 3

3

正如@Richard 解释的那样,当您将两个长度不同的字符变量读入公共矩阵的列时,就会发生这种情况。我能想到至少三种解决方法。根据您的应用程序,其中一种方法可能比其他方法更方便。

proc iml;
/* Option 1: Read variables into vectors, not a matrix */
use work.data1;
read all var {classif time };
close;
print (nleng(time))[L="nleng(time)"];

/* Option 2: Allocate time to have LENGTH=7 and copy the data in */
use work.data1;
read all var {classif time } into _temp_1;
close;
time = j(nrow(_temp_1), 1, BlankStr(7));  /* allocate char vector */
time[,]   = _temp_1[,2];                  /* copy the data */
print (nleng(time))[L="nleng(time)"];

/* Option 3: Read into a table instead of a matrix. */
tbl = TableCreateFromDataset("work", "data1") ;
classif = TableGetVarData(tbl, {"Classif"});
time = TableGetVarData(tbl, {"time"});
print (nleng(time))[L="nleng(time)"];
于 2022-02-07T12:41:16.320 回答
2

如果您希望 DATA1 中的变量在 DATA2 中定义相同,您可以在 PROC IML 代码之后添加一个数据步骤。

data data2;
  set data1(obs=0) data2;
run;

它之所以有效,是因为 SAS 在第一次看到变量时就定义了它们。在这种情况下,变量由 DATA1 中的定义方式定义,即使 OBS=0 数据集选项将阻止实际从 DATA1 读取任何观察值。

于 2022-02-07T14:24:22.963 回答
1

了解 SAS/IML 语言

定义矩阵

矩阵是 SAS/IML 语言中的基本结构。矩阵是数值或字符值的二维数组。矩阵对于处理数据很有用,并且具有以下属性:

  • 矩阵可以是数字或字符。数值矩阵的元素是双精度值。字符矩阵的元素是等长的字符串。

INTO字符值放入_temp_1必须包含所有原始值的矩阵中,因此元素宽度是最宽数据集变量的属性长度。

矩阵元素的属性_temp_1通过赋值语句传播。

于 2022-02-07T10:33:45.977 回答