【问题标题】:In SAS, how to execute a variable string as an if-statement (var = "if x = y")?在 SAS 中,如何将变量字符串作为 if 语句执行(var = "if x = y")?
【发布时间】:2015-08-24 18:50:58
【问题描述】:

我有一个数据集,其中包含一个我想在代码中使用的名为“Condition”的变量。我猜我需要在宏中执行此操作,但我仍在学习如何在 SAS 中编写宏。

所以如果我的数据集是这样的:

Question,Answer,Condition,Result
Q1,1,Answer=1," "
Q2,2,Answer=1," "
Q3,3,Answer=4," "

那我想让程序把Condition变量当作一个字符串,然后用它作为if语句:

if Condition then Result = "Correct";

这可能吗?

【问题讨论】:

  • 实际上,如果您确实有问题和答案以及一组有效答案,那么您可能需要考虑使用 PROC SCORE 对答案进行“评分”。
  • 我想要完成的是一个程序,它检查数据集的跳跃模式和答案,这取决于其他问题的回答方式。我想出的是让研究人员使用 Excel(他们熟悉)创建一个答案键,其中一部分键是添加要回答的问题必须为真的条件。研究人员写下条件(“答案 = 1”),然后程序获取实际答案并标记那些不符合条件的答案。我希望不对条件语句进行硬编码,而是让研究人员将它们写入 excel。
  • @Andy 你可能想看看我在 MWSUG2014 上共同撰写的论文,Documentation Driven Programming,这与你正在做的事情非常接近。它显示了类似的方法。
  • 您不能只从包含每个问题的正确答案的条件列中创建一个新列,然后将给定答案与正确答案进行比较吗?还是我错过了什么?
  • @user667489 鉴于澄清评论,这种事情是行不通的 - 逻辑不仅仅是跳过模式和范围检查的“一个正确答案”。

标签: if-statement sas sas-macro


【解决方案1】:

这并不容易。对于您的简单示例,您可以这样做:

data want ;
   set have ;
   if cats('Answer=',answer) = condition then .... 

但这并不适用于 CONDITION 引用其他变量值的情况。您可能能够从一组唯一的 CONDITION 值生成代码。

样本数据:

data have ;
  infile cards dsd truncover ;
  input Question $ Answer Condition :$30. Expected $ ;
cards;
Q1,1,Answer=1,"Correct"
Q2,2,Answer=1,"Wrong"
Q3,3,Answer=4,"Wrong"
;;;;

使用 CONDITION 的唯一值生成代码。

filename code temp ;
data _null_;
  set have end=eof ;
  by condition ;
  file code ;
  if _n_=1 then put 'SELECT ;' ;
  if first.condition then put '  WHEN (' CONDITION= :$quote. ' AND (' condition ')) RESULT="CORRECT" ;' ;
  if eof then put '  OTHERWISE RESULT="WRONG";'
                / 'END;'
  ;
run;

在数据步骤中使用生成的代码。

data want ;
  set have ;
  %inc code / source2;
run;

示例日志记录。;

252  data want ;
253    set have ;
254    %inc code / source2;
255 +SELECT ;
256 +  WHEN (Condition="Answer=1"  AND (Answer=1 )) RESULT="CORRECT" ;
257 +  WHEN (Condition="Answer=4"  AND (Answer=4 )) RESULT="CORRECT" ;
258 +  OTHERWISE RESULT="WRONG";
259 +END;
NOTE: %INCLUDE (level 1) ending.
260  run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多