我有一个变量列出了存储所需信息的变量名称。此变量将所有变量名称存储为字符串。我正在尝试创建另一个变量,该变量只包含变量行中的任何变量,该变量的名称存储在第一个变量下。例如,
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
答案 0 :(得分:5)
您可以使用VVALUEX
function,如下所示:
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
答案 1 :(得分:1)
Cyborgx37的答案(VValueX)绝对是最佳选择。您无法使用宏变量执行此操作的原因是宏变量存储变量名称的文本(因此在您的示例中为var_names
)而不是该变量的值。您无法在数据步骤中使用它,因为在创建的数据步骤中,宏变量不可用于编译时的目的(例如获取a的值)变量命名为)。
你可以这么做:
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&#34 ;;你不能使用" var_a"作为该上下文中的变量名称。这里没有一个好的宏观解决方案;你可以将var_names的所有值存储在一个分隔的字符串中并解析它,但它会非常混乱并涉及将数据放入一个宏变量,这违反了正确的程序设计原则。