在SAS数据步骤中引用没有合并的另一个数据集?

时间:2019-03-09 23:12:16

标签: sas

感谢您的反馈,我仍然是一名程序员。我正在尝试在SAS中编写以下代码。

我有两个数据集a)和b),其中包含以下变量:

a) Bene_ID, county_id_1, county_id_2, county_id_3 etc (it's 12 months) 
b) county_ID, rural (yes/no) 

我通常要做的是在数据步骤中创建一个数组:

Array country (12) county_ID_1- county_ID_12 

并通过对bene_ID的分组处理使用,以输出如下所示的长(规范化)数据集:

   bene_id, month 1, county_id 
    bene_id, month 2, county_id
    bene_id, month 3, county_id 

但是,如何在数据步骤中访问其他数据集b)?引入农村变量?这就是我想要的:

bene_id, month 1, county_id, if rural = "yes"
bene_id, month 2, county_id, if rural = "yes"
bene_id, month 3, county_id, if rural = "yes"

我尝试在此公告板上查找其他类似的问题,但我什至不确定要搜索的术语是否正确。我不想进行完全合并的原因是:如何对数组值进行过滤?例如当农村=“否”?

谢谢大家, 洛里

2 个答案:

答案 0 :(得分:2)

这是使用FORMAT会有所帮助的示例。您可以使用第二个数据集来创建格式

data formats;
  retain fmtname 'rural';
  set b;
  rename county_id=start rural=label;
run;

proc format cntlin=formats ;
run;

,然后在处理第一个数据集时使用格式。

data want ;
  set A;
  array county_id_ [12];
  do month=1 to dim(county_id_);
    county=county_id_[month];
    rural = put(county,rural3.);
    output;
  end;
  drop county_id_: ;
run;

答案 1 :(得分:0)

您正在将数据结构从宽(数组形式)转换为高(分类形式)。这通常称为枢轴或转置。该转换将存储在每个数组元素 name (列)中的信息转换为可在行级访问的数据。

您可以将移调与县合并,以选择农村县。

* 80% of counties are rural;
data counties;
  do countyId = 1 to 50;
    if ranuni(123) < 0.80 then rural='Yes'; else rural='No';
    output;
  end;
run;

* for 10 people track with county they are in each month;
data have;
  do personId = 1 to 10;
    array countyId (12);
    countyId(1) = ceil(50*ranuni(123));
    do _n_ = 2 to dim(countyId);
      if ranuni(123) < 0.15 then 
        countyId(_n_) = ceil(50*ranuni(123)); * simulate 15% chance of moving;
      else
        countyId(_n_) = countyId(_n_-1) ;
    end;
    output;
  end;
run;

proc transpose data=have out=have_transpose(rename=(col1=countyId)) ;
  by personId;
  var countyId:;
run;

proc sort data=have_transpose;
  by countyId personId;
run;

data want_rural;
  merge have_transpose(in=tracking) counties;
  by countyId;
  if tracking and rural='Yes';
  month = input(substr(_name_, length('countyId')+1), 8.);
  drop _name_;
run;

如果您的广泛数据还有另外12列的集合,例如每个月分配的金额数组,则最好的方法是像@Tom所示进行“ DATA Step”转置,并在循环

  amount = amount_[month];