在SAS中,对于下面的两个测试数据集 - 对于“y”和“z”内的每个“amount”值,我需要提取相应的“x”。可能存在符合标准的多个“x”值。 最终结果应如下所示:
/*
4 banana eggs
15 .
31 .
7 banana
22 fig
1 eggs
11 coconut
17 date
41 apple
*/
我意识到这依赖于使用索引或二进制搜索,但我无法找到可行的解决方案!任何帮助将不胜感激!谢谢!
data test1;
input x $ y z;
datalines;
apple 29 43
banana 2 7
coconut 9 13
date 17 20
eggs 1 5
fig 18 26
;
run;
data test2;
input amount;
datalines;
4
15
31
7
22
1
11
17
41
;
run;
答案 0 :(得分:2)
加入两个数据集,使amount
介于y
和z
之间。
proc sql;
create table join as
select a.amount
,b.*
from test2 a
left join
test1 b
on a.amount between b.y and b.z;
quit;
按转置金额对结果进行排序。
proc sort data=join; by amount; run;
转置它。
proc transpose data=join out=trans;
by amount;
var x;
run;
现在,您将自己的水果分别放在名为col1
,col2
的变量中。
如果你想将它们全部放在一个由空格分隔的变量中,只需将它们连接起来。
data trans2(keep= amount text);
set trans(drop=_name_);
array v{*} _character_;
text = catx(' ', of v{*});
run;
答案 1 :(得分:0)
以下是使用“老式”数据步骤代码加PROC TRANSPOSE
:
data test1;
input x $ y z;
datalines;
apple 29 43
banana 2 7
coconut 9 13
date 17 20
eggs 1 5
fig 18 26
run;
data test2;
input amount;
datalines;
4
15
31
7
22
1
11
17
41
run;
data want(keep=amount x);
set test2;
found = 0;
do _i_=1 to nobs;
set test1 point=_i_ nobs=nobs;
if y <= amount <= z then do;
found = 1;
output;
end;
end;
if not found then do;
x = ' ';
output;
end;
run;
proc transpose data=want out=want2(drop=_name_);
by amount notsorted;
var x;
run;
注意我的结果与您的示例中的结果不符;金额31是“苹果”。