感谢您的反馈,我仍然是一名程序员。我正在尝试在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"
我尝试在此公告板上查找其他类似的问题,但我什至不确定要搜索的术语是否正确。我不想进行完全合并的原因是:如何对数组值进行过滤?例如当农村=“否”?
谢谢大家, 洛里
答案 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];