如何在SAS中做两次for循环以生成保留列表?

时间:2019-04-06 22:59:28

标签: for-loop sas

我有一个非常大的数据集,包含超过1000列,列名称的格式如下:

WORLDDATA.table2_usa_2017_population
WORLDDATA.table2_japan_2017_gnp

我只需要为几个选定的国家/地区保留这些参数的子集。我指定了自定义列表:

%let list1 = usa canada uk japan southafrica;
%let list2 = population crimerate gnp;

我如何像这样进行double for循环:

param_list = []
for (i in list1) {
  for (j in list2) {
     param_name = WORLDDATA.table2_{list1[i]}_2017_{list2[j]}
     param_list.append(param_name)
  }
}

这样我可以在其中使用param_list

data final_dataset;
  set WORLDDATA.table2;
  keep {param_list};
run;

谢谢!

1 个答案:

答案 0 :(得分:0)

您的原始数据集有个数据项 countrytopic编码为列名( metadata ),您可能需要转置SAS过程步骤中使用的数据,这些过程将使用诸如wherebyclass之类的语句。

Proc TRANSPOSE可以将数据从宽到高旋转,并且输出将有一个名为_NAME_的列,可以在输出数据集的where=(where-statement)选项中使用。 where-statement 是一个正则表达式表达式,其中您的列表被指定为组(例如|)中的交替项((item-1|...|item-N))。正则表达式引擎将执行问题伪代码中的嵌套循环所执行的隐式外部联接。 regex模式将使用/ ix修饰符,以使其具有可人类阅读且不区分大小写的格式。

为了使Proc TRANSPOSE旋转数据集的每一行,数据集需要具有行与行之间不同的行键(一个或多个变量或组合的变量)。

未经测试的示例:

proc transpose data=have_wide out=want_subset_categorical (where=(
  prxmatch("(?ix)/
    table2_
      %sysfunc(translate(&LIST1.,|,%str( ))   (?# list 1 spaces converted to | ors )
    _2017_
      %sysfunc(translate(&LIST2.,|,%str( ))   (?# list 2 spaces converted to | ors )

  /",_name_)
));
  by <row-key>;
run;