全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4134 13
2016-09-13
如题:
原始数据集含 ID A B三个变量
id   a     b
1  1.1   2
2  1.2   4
3 1.3    4
4  1.0   1
要给每个ID生成一个新变量C,生成原则是,与该ID对应变量a 最接近的两个观测的b的平均
比如 与ID 1的a最接近的是ID 2 和 ID4 那么ID1对应的c=(4+1)/2=2.5由此生成的数据集为
ID   A       B      C
1   1.1    2       2.5
2    1.2   4       3
3    1.3    4   3
4   1.0    1    3
请问各位大侠这个SAScode如何写

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-9-13 20:31:46
请问id=3时,A=1.3,跟1.3最接近的应该是1.1和1.2,对应的B的值是2和4,C的值应该是3,为什么是2.5?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-9-13 21:43:51
wwang111 发表于 2016-9-13 20:31
请问id=3时,A=1.3,跟1.3最接近的应该是1.1和1.2,对应的B的值是2和4,C的值应该是3,为什么是2.5?
抱歉啊,我输错了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-9-13 22:26:48
try this:

data test;
input id a  b;
cards;
1  1.1   2
2  1.2   4
3  1.3   4
4  1.0   1
;

data step1;
set test;
do i=1 to nobs;
set test1(drop=id rename=(a=a1 b=b1)) nobs=nobs point=i;
  val=abs(a-a1);
  if a ne a1 then output;
end;
run;

proc sort data=step1;
by id val;
run;

data step2;
set step1;
by id val;
if first.id then n=0;
n+1;
if n<=2;
run;

proc sql;
create table wanted as
select distinct id, a, b, mean(b1) as c
from step2
group by id;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-9-13 22:47:16
data aaa;
        input id a b;
        cards;
        1 1.1 2
        2 1.2 4
        3 1.3 4
        4 1.0 1
        ;
run;
/*数据集拼接*/
proc sql;
        create table aaa_new as
            select* from aaa,aaa(rename=(id = id1 a = a1 b = b1));
quit;
/*删除ID相同的观测,并求差值*/
data aaa_new;
    set aaa_new;
        if id = id1 then delete;
        diff = abs(a-a1);
run;
/*排序,为后续做准备*/
proc sort data = aaa_new;
        by id diff;
run;
/*让每个ID的第一个DIFF为9999,这是为了使第一行变成最小值,方便使用LAG函数*/
data aaa_new1;
    set aaa_new;
        by id;
        if first.id = 1 then diff = 9999;
run;
proc sql;
        select id, a, b, (b1+lag(b1))/2 as c from aaa_new1
                group by id
                having diff = min(diff);
quit;
/*求变量C*/
data aaa_final;
        set aaa_new1;
        c = (b1+lag(b1))/2;
        output;
run;
/*输出结果,在输出窗口*/
proc sql;
        select id, a, b, c from aaa_final
        group by id
        having diff = min(diff);
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-9-13 22:54:53
已经有同学回答了,本帖的悬赏到此结束,但是有大侠有其他思路也欢迎讨论,在本楼前回答的同学我会兑付
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群