全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3365 10
2009-01-11

数据是三个变量组成,需要提取的数据包括:(1)当n=1时的数据;(2)如果n不等于1 则提取最大的n,这里最大的是相对于n不等于1区间而言,即,比如n=1时则提取该数据,第二个则应该提取的是n=5的数据。。。。。

a       n    b

0.01   1  0.01
0.01   2  0.02
0.03   3  0.05
0.11   4  0.16
0.07   5  0.23
0.00   1  0.00
0.05   1  0.05
0.00   2  0.05
0.00   6 0.05
0.00   1  0.00
0.00   2  0.00
0.00   3  0.00
0.00   4  0.00
0.00   5  0.00
0.03   1  0.03
0.00   2  0.03
0.00   3  0.03
0.01   4  0.04
0.00   5  0.04
0.01   1  0.01
0.05   2  0.06
0.05   3  0.11
0.05   4  0.16
0.00   1  0.00
0.00   2  0.00

想了很久,考虑用do while语句,但数据量比较大,大约有1万个左右,运算太慢了,请大家看看有何更好的方法吗?多谢!

二维码

扫码加我 拉你入群

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

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

全部回复
2009-1-11 17:26:00

给LZ想出下 笨办法,请参考,程序如下:

data a1 a2;
      set a; /*假定LZ的数据集为a*/
          if n=1 then output a1;
           else output a2;
run;


proc sort data=a2;
           by descending n;
proc print data=a2; /*查看排序的结果,看最大的 n 是多少,此外假定是大的 n 是 nmax*/
run;


data a2;
     set a2;
  if  n=nmax then output;
run;
proc print data=a2; /*查看抽取的结果是不是期望的最大 n */
run;

二维码

扫码加我 拉你入群

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

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

2009-1-11 17:41:00

谢谢楼上帮助,可能我没有将问题说的很清楚,提取数据的困难其实在于在前后两个n等于1中间选择其最大值,比如

0.01   1  0.01
0.01   2  0.02
0.03   3  0.05
0.11   4  0.16
0.07   5  0.23
0.00   1  0.00

这时候就要提取三个数,即

0.01   1  0.01

0.07   5  0.23

0.00   1  0.00

因此拆分数据可能难以实现要求。

二维码

扫码加我 拉你入群

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

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

2009-1-11 17:43:00
[em03]

[此贴子已经被作者于2009-1-11 17:52:52编辑过]

二维码

扫码加我 拉你入群

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

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

2009-1-11 18:35:00

data a;
  input a n b @@;
  cards;
0.01   1  0.01
0.01   2  0.02
0.03   3  0.05
0.11   4  0.16
0.07   5  0.23
0.00   1  0.00
0.05   1  0.05
0.00   2  0.05
0.00   6  0.05
0.00   1  0.00
0.00   2  0.00
0.00   3  0.00
0.00   4  0.00
0.00   5  0.00
0.03   1  0.03
0.00   2  0.03
0.00   3  0.03
0.01   4  0.04
0.00   5  0.04
0.01   1  0.01
0.05   2  0.06
0.05   3  0.11
0.05   4  0.16
0.00   1  0.00
0.00   2  0.00
;
run;


data b;
   set a;
   if n=1 then do;
     type+1;
  end;
  else;
run;


proc sort data=b out=c;
  by type n;
  run;

  data d (drop=type);
  merge c c;
  by type;
  if first.type=1 or last.type=1;
  run;

d 就是所需要的数据集。

二维码

扫码加我 拉你入群

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

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

2009-1-11 19:56:00
以下是引用xuwei2007在2009-1-11 18:35:00的发言:

data a;
  input a n b @@;
  cards;
0.01   1  0.01
0.01   2  0.02
0.03   3  0.05
0.11   4  0.16
0.07   5  0.23
0.00   1  0.00
0.05   1  0.05
0.00   2  0.05
0.00   6  0.05
0.00   1  0.00
0.00   2  0.00
0.00   3  0.00
0.00   4  0.00
0.00   5  0.00
0.03   1  0.03
0.00   2  0.03
0.00   3  0.03
0.01   4  0.04
0.00   5  0.04
0.01   1  0.01
0.05   2  0.06
0.05   3  0.11
0.05   4  0.16
0.00   1  0.00
0.00   2  0.00
;
run;


data b;
   set a;
   if n=1 then do;
     type+1;
  end;
  else;
run;


proc sort data=b out=c;
  by type n;
  run;

  data d (drop=type);
  merge c c;
  by type;
  if first.type=1 or last.type=1;
  run;

d 就是所需要的数据集。

干的漂亮!昨天晚上,我看到array(本坛下载的)内容,才知道first和last有妙用。可能是专门用于洗涤该类型数据的。

由此也应该能简化本人前几天写的那个游程检验代码。

二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群