楼主: Rock2000
1279 11

[有偿编程] 怎样从某数据集中抽取符合另一数据集数据值的所有变量 [推广有奖]

  • 1关注
  • 24粉丝

学术权威

22%

还不是VIP/贵宾

-

威望
1
论坛币
104812 个
通用积分
25.6012
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23619 点
帖子
547
精华
0
在线时间
10774 小时
注册时间
2004-5-27
最后登录
2024-4-25

20论坛币
假设有某数据集A,变量如下
V1 v2 v3 v4
具体数据如下
V1       v2       v3         v4
张三   李四   王五        陈六
张二    王一  张三        陈一
陈六    王二  李四(1)   张二
张二    王一  张一       陈一
陈一   王一  张三(2)   李二

数据集B如下
V5
张三
李四

要求从数据集A中所有变量中,凡是符合数据集B变量V5中数据值中的所有记录,抽取到数据集C,得到数据集C如下:
V1       v2       v3         v4
张三   李四   王五        陈六
张二    王一  张三        陈一
陈六    王二  李四(1)   张二
陈一   王一  张三(2)   李二


我使用的程序是用Index()函数判断抽取,但如果数据集B的V5的数据很多,代码量就很多,是否可以SQL抽取,谢谢。


最佳答案

wang1839 查看完整内容

x{j}=v5 recitify as index(x{j},compress(v5))
关键词:数据集 Index sql IND
已有 1 人评分经验 收起 理由
eijuhz + 40 精彩帖子

总评分: 经验 + 40   查看全部评分

沙发
wang1839 在职认证  发表于 2019-11-15 17:16:36 |只看作者 |坛友微信交流群
      x{j}=v5 recitify as index(x{j},compress(v5))

使用道具

藤椅
wps930720 在职认证  发表于 2019-11-20 10:57:39 |只看作者 |坛友微信交流群
proc content 得到数据集A的所有变量名和个数n,依据个数写个proc sql循环,从where a.v1 in (select v5 from 数据集B) 开始,一直到Vn结束,生成N个数据集,再把N个数据集合并去重

使用道具

板凳
Rock2000 发表于 2019-11-20 23:41:35 |只看作者 |坛友微信交流群
wps930720 发表于 2019-11-20 10:57
proc content 得到数据集A的所有变量名和个数n,依据个数写个proc sql循环,从where a.v1 in (select v5 fr ...
能否写出具体的code吗?谢谢。

使用道具

报纸
gudingji 在职认证  发表于 2019-11-25 09:50:23 |只看作者 |坛友微信交流群
  1. proc transpose data=b out=b1(drop_name_) prefix=n: var v5;run;
  2. data a;set a;index=1; run;
  3. data b1; set; index=1; run;
  4. data ab; merge a b1; by index;run;
  5. data abl;
  6.     set ab;
  7.     array v(*) vl-v4;
  8.     array n(*) nl-n2;
  9.     do i=1 to dim(v);
  10.         do j= to dim(n);
  11.             if compress(v[i], "(1234567890)")=n[j] then yes=1;
  12.         end;
  13.     end;
  14.     drop i j;
  15. run;
  16. data ab2(drop=yes): set abl; if yes=1; run;
复制代码

微信图片_20191125094225.png (75.23 KB)

微信图片_20191125094225.png

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Rock2000 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

地板
Rock2000 发表于 2019-11-26 17:49:56 |只看作者 |坛友微信交流群
gudingji 发表于 2019-11-25 09:50
不好意思,可能我举的例子不太详细,导致你的code不完全符合我的要求。

使用道具

7
Rock2000 发表于 2019-11-26 17:59:40 |只看作者 |坛友微信交流群
其实,我用index函数是可以完成我的要求的。
我重新把要求及我的code贴出来,看有无更好的code
数据集A
id v1$10. v2$ v3$ v4$;
1 张三   李四  王五    陈六
2 张二   王一  张三    陈一
3 陈六   王二  李四(1) 张二
4 张二   王一  张一    陈一
5 陈一   王一  张三(2) 李二
6 陈一   王一  张二    吴7
7 陈七、张三  吴六  李1  王二


数据集B
V5
张三
李四
吴7


要求:
从数据集A中所有变量中,凡是符合数据集B变量V5中数据值中的所有记录,抽取到数据集C

我使用index函数完成的code

  1. data a;
  2. input id v1$10. v2$ v3$ v4$;
  3. cards;
  4. 1 张三   李四  王五    陈六
  5. 2 张二   王一  张三    陈一
  6. 3 陈六   王二  李四(1) 张二
  7. 4 张二   王一  张一    陈一
  8. 5 陈一   王一  张三(2) 李二
  9. 6 陈一   王一  张二    吴7
  10. 7 陈七、张三  吴六  李1  王二
  11. ;
  12. run;

  13. data c;
  14. set a;
  15. if index(v1,"张三")>0 or index(v2,"张三")>0 or index(v3,"张三")>0 or index(v4,"张三")>0   then yes=1;
  16. if index(v1,"李四")>0 or index(v2,"李四")>0 or index(v3,"李四")>0 or index(v4,"李四")>0   then yes=1;
  17. if index(v1,"吴7")>0  or index(v2,"吴7")>0  or index(v3,"吴7")>0  or index(v4,"吴7")>0    then yes=1;
  18. if yes=1;
  19. run;
复制代码
我的code中是没有直接用数据集B,是利用数据集B的所有记录内容来筛选,这里有个问题,如果数据集B的记录不是3个,而是很多,我就需要很多行code,所有我想优化此过程,怎样做到?

使用道具

8
suzhzh 发表于 2019-11-28 09:25:42 |只看作者 |坛友微信交流群
PROC SQL seems more simple and straightforward.

使用道具

9
wang1839 在职认证  发表于 2019-12-3 10:56:48 |只看作者 |坛友微信交流群
data a;
input v1 $ v2 $ v3 $ v4 $;
cards;
张三    李四   王五        陈六
张二    王一   张三        陈一
陈六    王二  李四(1)   张二
张二    王一  张一       陈一
陈一    王一  张三(2)   李二
;
run;

data b;
input V5 $;
cards;
张三
李四
;
run;


data c;
        set a;
        array x v1-v4;
        do i=1 to all;
        set  b  nobs=all point=i;
        do j=1 to dim(x);
        if x{j}=v5 then output;
        end;
        end;
        drop i j v5;
run;

proc sort data=c out=d nodup;
by v1-v4;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Rock2000 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

10
Rock2000 发表于 2019-12-3 15:05:39 |只看作者 |坛友微信交流群
wang1839 发表于 2019-12-3 10:56
data a;
input v1 $ v2 $ v3 $ v4 $;
cards;
谢谢

但你这个还是不对,是v1-v4中包含有v5的值,但v1-v4的值不一定是=v5的,比如,v3=张三(2),这是包含有“张三”,这里不是v3=v5。

使用道具

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

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

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

GMT+8, 2024-4-26 21:31