楼主: dxystata
3284 8

如何列出两个数据集或三个数据集共有的变量名 [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

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

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

20论坛币
RT,谢谢!

关键词:数据集 如何

本帖被以下文库推荐

沙发
ntsean 发表于 2013-1-27 09:10:53 |只看作者 |坛友微信交流群
可以用SAS里面的dictionary, 举例如下,

data data1;
  x=1;
  y=2;
run;

data data2;
  x=3;
  z=5;
run;

data data3;
  x=5;
  w=6;
run;

proc sql;
  select a.name as name
  from (select name from dictionary.columns where libname = "WORK" and memname = "DATA1") a,
       (select name from dictionary.columns where libname = "WORK" and memname = "DATA2") b,
           (select name from dictionary.columns where libname = "WORK" and memname = "DATA3") c
  where a.name = b.name and b.name = c.name;
quit;
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

总评分: 论坛币 + 20  热心指数 + 2   查看全部评分

使用道具

藤椅
pobel 在职认证  发表于 2013-1-27 09:15:45 |只看作者 |坛友微信交流群
proc sql;
   create table common_var as
    select distinct name, memname
          from dictionary.columns
          where libname="SASHELP" /*and upcase(memname) in (your-dataset-list-of-interest)*/
          group by name
          having count(distinct memname)>1;
quit;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

和谐拯救危机

使用道具

板凳
njlhd 发表于 2013-1-27 09:43:30 |只看作者 |坛友微信交流群

使用道具

报纸
ihust 发表于 2013-1-27 10:43:21 |只看作者 |坛友微信交流群
  1. data tmp1;
  2.         input x y z a b ;
  3. datalines;
  4. 1 2 3 4 5
  5. 6 7 8 9 10
  6. ;
  7. run;
  8. data tmp2;
  9.         input c d e x y;
  10. datalines;
  11. 2 3 4 5 6
  12. 1 2 3 4 5
  13. ;
  14. run;
  15. proc contents data=tmp1 out=out1(keep=name);
  16. run;
  17. proc contents data=tmp2 out=out2(keep=name);
  18. run;
  19. /*两个数据集时*/
  20. proc sql;
  21.         create table out as
  22.         select name
  23.         from out1
  24.         where (name in (select name from out2))
  25.         ;
  26. quit;

  27. data tmp3;
  28.         input a1 a2 x y a3;
  29. datalines;
  30. 8 7 6 5 4
  31. 2 3 4 5 6
  32. ;
  33. run;
  34. proc contents data=tmp3 out=out3(keep=name);
  35. run;
  36. /*三个数据集时*/
  37. proc sql;
  38.         create table out as
  39.         select name
  40.         from out1
  41.         where (name in (select name from out2)) and (name in (select name from out3))
  42.         ;
  43. run;
复制代码


已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

地板
zhengbo8 发表于 2013-4-7 15:28:09 |只看作者 |坛友微信交流群
对于小数据集,还是可以的。

  1. data a;
  2.     x=1;
  3.     y=2;
  4. run;

  5. data b;
  6.     x=3;
  7. run;

  8. data c;
  9.     x=4;
  10.     y=6;
  11. run;

  12. proc transpose data=a out=a1;run;
  13. proc transpose data=b out=b1;run;
  14. proc transpose data=c out=c1;run;

  15. data common(keep=_name_);
  16.     merge a1(in=in_a) b1(in=in_b) c1(in=in_c);
  17.     if in_a and in_b and in_c;
  18.     label _name_="公共变量";
  19. run;
复制代码




已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

7
christineslt 学生认证  发表于 2017-2-21 12:01:42 |只看作者 |坛友微信交流群
ihust 发表于 2013-1-27 10:43
你好,这个程序不能识别大小写字母?比如AGE和age要怎么解决呢?

使用道具

8
sherry123 发表于 2017-2-23 01:39:02 |只看作者 |坛友微信交流群
你可以在ihust的程序里把名字都变成大写:
proc sql;
        create table out as
        select name
        from out1
        where (upcase(name) in (select upcase(name) from out2)) and (upcase(name) in (select upcase(name) from out3))
        ;
run;

使用道具

9
sherry123 发表于 2017-2-23 02:06:42 |只看作者 |坛友微信交流群
用ihust 的3个datasets, 这样也可以吧:
proc contents data=_all_ out=out1(keep=memname name);
run;
data out2;
set out1;/*  where memname in ('TMP1' 'TMP2' 'TMP3');  ---如果很多别的datasets 不想考虑 */
name=upcase(NAME); /* 把age 变成AGE */
run;
proc freq data =out2;
table name/ out=out3 (where= (count=3));
run;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-19 17:34