楼主: dxystata
945 6

根据要求产生新的变量 [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182303 个
通用积分
15205.6089
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291306 点
帖子
5378
精华
1
在线时间
13479 小时
注册时间
2006-6-21
最后登录
2024-4-28

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

50论坛币
  1. data aaa;
  2. input id x$ y$@@;
  3. cards;
  4. 1  a  x1
  5. 1  a  y1
  6. 1  a  x3
  7. 1  b  y2
  8. 1  b  x2
  9. 1  b  x4
  10. 2  a  x1
  11. 2  a  x3
  12. 2  b  y2
  13. 2  b  x2
  14. 2  b  x4
  15. 2  b  y3
  16. 3  a  x1
  17. 3  a  y1
  18. 3  a  x3
  19. 3  a  x5
  20. 3  b  y2
  21. 3  b  x2
  22. ;
  23. run;

  24. 根据变量x中a对应的变量y的取值有x1 y1 x3 x5 产生新的变量取值为1 2 3 4
  25.           b对应的变量y的取值有y2 x2 x4 y3 产生新的变量取值为5 6 7 8
  26. 1  a  x1  1
  27. 1  a  y1  2
  28. 1  a  x3  3
  29. 1  b  y2  5
  30. 1  b  x2  6
  31. 1  b  x4  7
  32. 2  a  x1  1
  33. 2  a  x3  3
  34. 2  b  y2  5
  35. 2  b  x2  6
  36. 2  b  x4  7
  37. 2  b  y3  8
  38. 3  a  x1  1
  39. 3  a  y1  2
  40. 3  a  x3  3
  41. 3  a  x5  4
  42. 3  b  y2  5
  43. 3  b  x2  6
复制代码
谢谢!

最佳答案

wwang111 查看完整内容

如果新变量的取值是按照x, y在数据集里出现的顺序,可以试试这个:
关键词:cards Input Data card RDS
沙发
wwang111 发表于 2016-8-24 10:13:03 |只看作者 |坛友微信交流群
如果新变量的取值是按照x, y在数据集里出现的顺序,可以试试这个:

  1. data obs;
  2. set aaa;
  3. obs=_n_;
  4. run;

  5. proc sql;
  6. create table fmtsort as
  7. select x, y, obs
  8. from obs
  9. group by x, y
  10. having obs=min(obs)
  11. order by x,obs;
  12. quit;

  13. data fmt;
  14. set fmtsort;
  15. by x obs;
  16. retain fmtname '$newvar';
  17. type='c';
  18. if _n_=1 then label=0;
  19. label+1;
  20. rename y=start;
  21. keep y label fmtname type;
  22. run;

  23. proc format cntlin=fmt;
  24. run;

  25. data wanted;
  26. set aaa;
  27. newvar=put(y,$newvar.)+0;
  28. run;
复制代码



已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
dxystata + 20 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

只有一个罗纳尔多

使用道具

藤椅
wwang111 发表于 2016-8-24 10:27:17 |只看作者 |坛友微信交流群
如果只是这些类似的情况,直接赋值就可以吧?

data wanted;
set aaa;
if x='a' then do;
  if y='x1' then newvar=1;
  else if y='y1' then newvar=2;
  else if y='x3' then newvar=3;
  else if y='x5' then newvar=4;
end;
else if x='b' then do;
  if y='y2' then newvar=5;
  else if y='x2' then newvar=6;
  else if y='x4' then newvar=7;
  else if y='y3' then newvar=8;
end;
run;

使用道具

板凳
dxystata 发表于 2016-8-24 10:41:07 |只看作者 |坛友微信交流群
wwang111 发表于 2016-8-24 10:27
如果只是这些类似的情况,直接赋值就可以吧?

data wanted;
这里举的简单的例子,当面更复杂了,一个一个用if语句太麻烦啦!

使用道具

报纸
wwang111 发表于 2016-8-24 10:52:23 |只看作者 |坛友微信交流群
新变量的取值跟id, x, y的值之间有什么规律吗?

就是规定 x=a, y=x5, newvar=4之类的,还是1,2,3,4的取值是根据x, y的值在数据集中的顺序?

使用道具

地板
dxystata 发表于 2016-8-24 14:33:09 |只看作者 |坛友微信交流群
1,2,3,4的取值是根据x, y的值在数据集中的顺序

使用道具

7
wwang111 发表于 2016-8-24 15:51:18 |只看作者 |坛友微信交流群
那可以试一试上面的代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 13:58