楼主: dxystata
1408 6

如何找出每个个体中x值小于2并离2最近的观测 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2016-10-31 23:16:42 |AI写论文
20论坛币
  1. data aaa;
  2. input no x;
  3. cards;
  4. 1  1
  5. 1  1.5
  6. 1  1.8
  7. 1  2
  8. 1  3
  9. 2  1.5
  10. 2  2
  11. 2  2.5
  12. 3  1.5
  13. 3  1.9
  14. 3  2.5
  15. 3  4
  16. ;
  17. run;
复制代码
如何找出每个个体中x值小于2并离2最近的观测,用一个新变量标记。
谢谢!

关键词:cards Input Data card Run 如何

沙发
wang1839 在职认证  发表于 2016-10-31 23:31:21
问题转化为每个ID的x<2的min(2-x)OBS.
proc sql;
create table obs as select min(2-x) as min,no,x from aaa where x<2 group by no having min=(2-x);
quit;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
dxystata 发表于 2016-10-31 23:36:52
wang1839 发表于 2016-10-31 23:31
问题转化为每个ID的x
数据集aaa中多一个变量,比如用0表示每个个体中x值小于2并离2最近的观测。

板凳
wwang111 发表于 2016-11-1 08:41:08
proc sql;
create table wanted as
select a.*, minx
from aaa a left join
(select *, abs(x-2) as y, 0 as minx
from aaa
where x<2
group by 1
having y=min(y)) b
on a.no=b.no and a.x=b.x;
quit;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

报纸
wang1839 在职认证  发表于 2016-11-1 09:28:06
merge回去 by no x,然后min 不为空FLAG=0;ELSE flag=1

地板
dxystata 发表于 2016-11-1 09:54:19
我的答案
  1. data bbb;
  2.         set aaa(where=(x<2));
  3.         by no x;
  4.         if last.no then flag='Y';
  5. run;

  6. data ccc;
  7.         merge aaa(in=a) bbb(in=b);
  8.         by no x;
  9. run;
复制代码

7
木子星 发表于 2016-11-1 09:54:46
笨方法,供参考!
  1. /*原始数据input*/
  2. data aaa;
  3. input no x;
  4. cards;
  5. 1  1
  6. 1  1.5
  7. 1  1.8
  8. 1  2
  9. 1  3
  10. 2  1.5
  11. 2  2
  12. 2  2.5
  13. 3  1.5
  14. 3  1.9
  15. 3  2.5
  16. 3  4
  17. ;
  18. run;
  19. /*对x小于2的记录标记flag=1,计算距离值2-x,大于等于2的记录标记flag=2,距离值默认999*/
  20. data bbb;
  21.         set aaa;
  22.         if x<2 then do;
  23.                 flag=1;
  24.                 distance=2-x;
  25.                 end;
  26.         else do;
  27.                 flag=2;
  28.                 distance=999;
  29.                 end;
  30. run;
  31. /*排序*/
  32. proc sort data=bbb;
  33.         by no flag distance;
  34. run;
  35. /*赋值最小距离值标签*/
  36. data ddd;
  37.         set bbb;
  38.         by no flag distance;
  39.         if first.no & first.flag & first.distance then group=0;
  40.         keep no x group;
  41. run;
  42. proc print data=ddd;
  43. run;
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 18:09