0

我有一个 SAS 数据集:

+-------+-------+-------+-------+
| var_1 | var_2 | var_3 | index |
+-------+-------+-------+-------+
|     1 |    10 |   100 |     2 |
|     2 |    20 |   200 |     1 |
|     3 |    30 |   300 |     3 |
+-------+-------+-------+-------+

现在,我想使用索引变量中的相应条目在同一数据集中创建一个新变量,其每行中的值来自 var_1、var_2 和 var_3 之一。

也就是说,如果我的输出变量是 var_out,那么数据集将如下所示:

+-------+-------+-------+-------+---------+
| var_1 | var_2 | var_3 | index | var_out |
+-------+-------+-------+-------+---------+
|     1 |    10 |   100 |     2 |      10 |
|     2 |    20 |   200 |     1 |       2 |
|     3 |    30 |   300 |     3 |     300 |
+-------+-------+-------+-------+---------+

这里 index 的第一个值为 2,因此 var_out 取 var_2 的值,即 10

如果需要,有什么办法可以使用宏变量吗?

4

4 回答 4

5

你会使用一个数组。

data want;
 set have;
 array vars var1-var3;
 var_out = vars[index];
run;
于 2014-06-15T12:26:34.737 回答
0

VVALUE 和 VVALUEX 也是选项,尽管它们返回字符值而不是数字。

data have;
input var_1 var_2 var_3 index;
cards;
1 10 100 2
2 20 200 1
3 30 300 3
;
run;

data want;     
set have;
var_out=vvaluex("var_"|| put(index, 2. -l));
run;

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002233818.htm

于 2014-06-16T14:46:37.710 回答
0

这也可以通过使用函数来实现,例如:

data want;
  set have;
  var_out=input(scan(catx(',', of var1-var3),index),8.);
run;
于 2014-06-16T11:51:35.500 回答
0

如果你想要宏:

%macro out(i); var_&i %mend out;
data t2;
  set t1;
  call symput('index', index);
  var_out=%out(&index);
run;
于 2015-12-30T10:53:12.343 回答