楼主: l6397
2313 11

[问答] 怎样循环比较、删除、保存? [推广有奖]

  • 0关注
  • 0粉丝

博士生

42%

还不是VIP/贵宾

-

威望
0
论坛币
120 个
通用积分
16.6418
学术水平
1 点
热心指数
6 点
信用等级
0 点
经验
3788 点
帖子
235
精华
0
在线时间
178 小时
注册时间
2007-3-28
最后登录
2023-5-13

楼主
l6397 发表于 2013-4-22 13:26:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
求助高人:怎样循环比较、删除?
       一数据集YS(原始)中有a1、a2、a3、a4、a5..........a15个变量,有几千组观测,这些观测都是数据。
想得到下列循环:
1、将数据集ys中的第一组观测保存到数据集bc1(保存)中。
2、将保存的这组数据集bc1中的每个变量与数据集ys的每个变量进行比较,如有一个观测相同,则删除这组观测,然后保存到ys1中。
3、保存数据集ys1中的第一组观测到数据集bc2中。
4、将保存的这组数据集bc2中的每个变量一数据集ys1的每个变量进行比较,如有一个观测相同,则删除这组观测,然后保存到ys2中。
5、再保存数据集ys2中的第一组观测到数据集bc3中。
这样循环保存、删除,直至保存最后一组观测,
6、再将所有保存的数据集bc1,bc2,bc3,bc4,......,bcn。进行串接。

谢谢各位!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据集

沙发
allisony_2013 发表于 2013-4-22 13:30:57

藤椅
playmore 发表于 2013-4-22 15:34:01
你的问题基本上就是计算原始表中每一组观测的重复次数
然后有重复的就把多余的放到其他表格中
但是你的算法太复杂,而且没意义
等你捋清思路再来问吧
否则SAS会被你折腾死
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

板凳
moyunzheng 发表于 2013-4-22 15:42:46
看到第六个"串联"部分,才知道是要干吗,如果ys1,ys2,ys3,...,ysn一点用处的没有的话,这样的算法确实.....
直接 sql 中select distinct 或者sort 中nodup就可以了.

报纸
Imasasor 发表于 2013-4-22 15:46:25
one ask sas : are u strong enough?
SAS answer: the power you know.
and he said : can u solve the  problem for me?
SAS looked at the problem in detail and said: **** me, please.
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

地板
l6397 发表于 2013-4-22 22:09:51
谢谢各位回复!!
     1、数据集ys中变量a1—a15的观测是千万位的数值,每组15个观测不相同,其他组可能有重复的数值。
     2、因为数据集ys的第一组a1—a15的观测是第一次出现,所有保存在bc1中。用bc1与ys比较删除有相同观测的组,得到的数据集保存在ys1中,(即ys1中的观测不会有bc1中相同的观测)。然后保存ys1中的第一组观测到数据集bc2中。。。。。。
     3、我是想得到:在变量a1—a15中第一次出现,且没有重复的的观测。
不知解释清楚没。 由于水平有限,只想到用循环比较删除,不知有没有其他方法?
谢谢!!!

7
yongyitian 发表于 2013-4-23 09:46:11
不敢肯定完全明白了LZ 的意思。

随机生成了一个200行的数据集,运行两次下面的宏就可以了。

如果数据多,可以多运行几次, 每次只需改变一下文件名。

或者写成一个可循环的宏。

data ys;
  array a{15} a1-a15;
     do N = 1 to 200;
        do j = 1 to dim(a);
           a(j) = abs(int(normal(123+j+n)*100));
        end;
           output;
      end;               
    drop j;
run;
proc print data=ys; title 'ys'; run; title;

%macro mymacro(dsn=, dout1=, dout2=);
  data &dout1(keep=n flag a1-a15)  
       &dout2(keep=n flag a1-a15);
   array a{15} a1-a15;
   array b{15} b1-b15;
   retain b1-b15;
    if _n_ = 1 then do;
       set &dsn(firstobs=1 obs=1);  
           output &dout2;
        do i = 1 to dim(a);
            b(i) = a(i);
        end;        
     end;
    set &dsn;
       if _n_^=1 then do;
               c = 0;
            flag = 0;
          do i = 1 to 15;
              if a(i) - b(i) = 0 then do;
                      c+1;
                 flag = i;   end;
          end;
          if  c > 0 then output &dout1;
       end;
   drop i;
run;
%mend mymacro;

%mymacro(dsn=ys,  dout1=ys1, dout2=bc1);
%mymacro(dsn=ys1, dout1=ys2, dout2=bc2);

8
yongyitian 发表于 2013-4-23 11:34:14
又看了一便LZ的要求,好象第二个output的条件应改为
if  c = 0 then output &dout1;

如果这样的话,运行34次上面的宏,才可以得到0observation in dataset ys34

9
l6397 发表于 2013-4-23 22:05:30
非常感谢各位高人的指点!!
其中改为:
     do i 1= 1 to 15;
          do i2=1 to 15;
              if a(i1) - b(i2) = 0 then do;
                      c+1;
                   end; end;
         end;
          if  c = 0 then output &dout1
检查发现存入ys1的数据是对的,但存入ys2的数据好像不对。
循环过程:
1、在数据集ys中将第一组(_n_=1)的观测,保存到数据集bc1中。
2、删除数据集ys中和bc1相同的观测,保存到ys1中。
3、将ys1的第一组观测,保存到bc2中。
4、删除ys1中和bc2相同的观测,保存到ys2
5、将ys2的第一组观测,保存到bc3
6、删除ys2中和bc3相同的观测,保存到ys3
........
直至最后一组,保存到bcn
再请教怎样用宏循环?
谢谢!!

10
yongyitian 发表于 2013-4-24 00:00:37
LZ的新条件使外循环的次数减少了很多。 看不出有什么问题。

满足 c=0 的输出结果(ys1)中应该不包含bc1中的任何一个数。也就是说 bc1 中的15个数都不会出现在 ys1 中。 同样, 如果在ys2中找不到bc2里15个数中任何一个. 那么结果就是正确的。

如果上面的宏没有问题,可以做一个循环, 每次循环生成新的文件名,如 ysn, bcn. 然后调用这个宏。 还要有一个条件, 检验新生成的数据集 (ysn) 的行数是否为零,大于零则继续循环。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 08:31