3

我有一个变量列出了存储我需要的信息的变量名称。此变量将所有变量名称存储为字符串。我正在尝试创建另一个变量,该变量仅包含名称存储在第一个变量下的变量行中的任何内容。例如,

var_names     var_a     var_b     new_variable    
  var_a         7         11          7
  var_a         2         9           2
  var_b         3         6           6
  var_a         6         9           6

上面的 var_names 有变量名,我正在尝试创建 new_variable。有任何想法吗?提前致谢。

到目前为止,我一直在努力寻找一个宏解决方案,但我无法让新变量实际上等于该字段,而不仅仅是它应该调用的变量的名称。

我相信这个问题的原因是我不知道如何制作一个由另一个变量定义的宏。即 %let mac = var_names 然后 new_variable = &varnames

4

2 回答 2

5

您可以使用该VVALUEX函数,如下所示:

DATA Work.Vars;

    INPUT   VarToUse    $
            VarA
            VarB
            VarC
            ;

DATALINES;
VarA 1 2 3
VarB 1 2 3
VarC 1 2 3
;;;;
RUN;

DATA Work.SelectedVars;
    SET Work.Vars;

    Var = VVALUEX( VarToUse );

    KEEP    Var;

RUN;

回报:

变量
1
2
3

于 2013-07-08T20:48:37.810 回答
1

Cyborgx37 的答案(VValueX)绝对是要走的路。您无法使用宏变量执行此操作的原因是宏变量存储变量名称的文本(因此在您的示例中,var_names)而不是该变量的值。您不能在数据步骤中使用它,因为宏变量在创建用于编译时目的的数据步骤中不可用(例如获取名为 that 的变量的值)。

你可以做到这一点:

data have;
input var_names $ var_a     var_b     new_variable ;
datalines;
var_a         7         11          7
var_a         2         9           2
var_b         3         6           6
var_a         6         9           6
;;;;
run;

data want;
set have;
call symput("varname",var_names);
x = symget("varname");
put x=;
run;

但是在那里,x 存储“var_a”;不允许在该上下文中使用“var_a”作为变量名。这里没有真正好的宏观解决方案。您可以将 var_names 的所有值存储在分隔字符串中并对其进行解析,但这会非常混乱,并且涉及将数据放入宏变量中,这违反了正确的程序设计原则。

于 2013-07-08T21:16:58.700 回答