楼主: Rock2000
1770 11

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

  • 1关注
  • 24粉丝

已卖:6892份资源

学术权威

23%

还不是VIP/贵宾

-

威望
1
论坛币
104790 个
通用积分
51.9656
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23510 点
帖子
520
精华
0
在线时间
10924 小时
注册时间
2004-5-27
最后登录
2025-11-12

楼主
Rock2000 发表于 2019-11-15 17:16:35 |AI写论文
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
拉您进交流群
GMT+8, 2025-12-31 08:20