SAS-将字段指定为另一个字段的内容

SAS-将字段指定为另一个字段的内容,sas,Sas,我有这样一个SAS数据集: 字段:A1 | A2 | A3 | A4 | A5 | A6 |索引| B 索引字段包含一个变量名:A1或A2或。。。还是A6 我希望B具有字段的内容,该字段位于INDEX字段中 如何动态地将字段B指定为索引字段中指定的字段?解决此问题的一个相当简单的方法是使用数组和VNAME data have; input a1 a2 a3 index $; datalines; 1 2 3 a1 2 3 4 a2 3 4 5 a3 4 5 6 a1 5 6 7 a3 ;;;;

我有这样一个SAS数据集:

字段:
A1 | A2 | A3 | A4 | A5 | A6 |索引| B

索引
字段包含一个变量名:A1或A2或。。。还是A6

我希望
B
具有字段的内容,该字段位于
INDEX
字段中


如何动态地将字段
B
指定为
索引
字段中指定的字段?

解决此问题的一个相当简单的方法是使用数组和VNAME

data have;
input a1 a2 a3 index $;
datalines;
1 2 3 a1
2 3 4 a2
3 4 5 a3
4 5 6 a1
5 6 7 a3
;;;;
run;

data want;
set have;
array as a1-a3;
do _t = 1 to dim(as);
 if upcase(vname(as[_t])) = upcase(index) then b = as[_t];
end;
run;

如果您有一个非常大的数组来提高性能,您可以在if中添加一个LEAVE语句(将其设为if…then do块)。

这不是一个有效的SAS变量名。如果这是变量标签,那么您可以使用VLABEL而不是VNAME。我了解Joe,唯一的问题是我的字段是“BU节点级别N Long Name”,N从1到29。例如,B有“BU节点级别14长名称”。在这种情况下,如何使用数组并处理长名称字段?谢谢这个例子应该完全按照原样工作,除了用VNAME替换VLABEL。如果您想更轻松地编写数组语句,可以使用:
array vars BU_Node_Level:
(或者不管您的实际变量名是如何构造的),甚至
数组变量\u numeric\u
只检查所有数值变量,如果没有太多多余的变量(它不应该与任何变量不匹配,因为它只会在找到一个匹配正确的变量时执行操作)。