楼主: yz7891
7136 46

[原创博文] 数据比较问题 [推广有奖]

11
yz7891 发表于 2010-4-27 14:50:12
还有个补充问题,比如我有
1
0
2
1
0
5个数字的数据集,我想让在最大数字前面小于最大数字的全变成最大数字
比如
2
2
2
1
0
这样,我应该怎么比较呢?

12
crackman 发表于 2010-4-27 14:51:28
4# yatming
proc sql;
select count (distinct *)  from a;
quit;
我的提示一直说是非法位置使用"*"

13
crackman 发表于 2010-4-27 14:55:46
10# yatming
我的版本是9.2的
按照你第一个方法
proc sql;
select count (distinct *)  from test;
quit;


1302  data er;
1303  input x y z j@;
1304  cards;
NOTE: 数据集 WORK.ER 有 13 个观测和 4 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒

1318  ;
1319  run;
1320  proc sql;
1321  select count (distinct *)  from er;
ERROR: 在非法位置使用了 *。
1322  quit;
NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒

14
yatming 发表于 2010-4-27 15:00:51
12# crackman
我记得好像可以的,不过也可能记错了,如果不行的话,可以先distinct,然后count或者data step 中put nobs就可以了吧。我目前也没SAS。效率上SQL和data STEP的HASH也无法测试了。呵呵。itemsize写错了,应该是item_size。

15
crackman 发表于 2010-4-27 15:05:07
我主要是看SAS LOG里面的运行时间来评价效率的
呵呵
不过也会存在牺牲空间换时间的效率问题

16
yz7891 发表于 2010-4-27 15:08:53
yz7891 发表于 2010-4-27 14:50
还有个补充问题,比如我有
1
0
2
1
0
5个数字的数据集,我想让在最大数字前面小于最大数字的全变成最大数字
比如
2
2
2
1
0
这样,我应该怎么比较呢?
帮忙看看 这个问题吧~~

17
yatming 发表于 2010-4-27 15:13:23
这个牵涉到回溯,个人认为一步data step应该不行,可以先得出最大数,再加个用来判断前后的变量,data step一条条来做。

18
yz7891 发表于 2010-4-27 15:17:39
SAS里面是不是有数组能够用,或者把这个问题  如何比较前后2个数字的大小,如果前面大 后面小 则交换互相位置。 怎么比较呢?如果能用数组应该怎么用呢?

19
crackman 发表于 2010-4-27 15:39:58
应该是有
list

20
crackman 发表于 2010-4-27 16:20:53
data er;
input x y z j@;
cards;
1 2 3 2
2 3 4 3
1 2 3 4
8 1 6 5
2 3 4 6
1 2 3 4
9 5 6 5
4 2 6 6
7 5 6 5
2 3 7 6
9 5 6 5
1 0 7 6
8 3 6 5
;
run;
data er;
set er;
obs=_n_;
run;
proc transpose data=er out=ee;
var _all_;
run;
data ee;
set ee;
obs=_n_;
select (_name_);
when ('x') col14=max(of col1-col13);
when ('y') col14=max(of col1-col13);
when ('z') col14=max(of col1-col13);
when ('j') col14=max(of col1-col13);
otherwise  col14=max(of col1-col13);
end;
call symput('n'||left(obs),col14);
run;
data x;
set er;
if x=&n1.;
run;
data x;
set x;
obs1=_n_;
if obs1=1;
call symput('obs',obs);
run;
data result;
set er;
if obs<&obs. then x=&n1.;
else x=x;
run;


data y;
set er;
if y=&n2.;
run;
data y;
set y;
obs1=_n_;
if obs1=1;
call symput('obs',obs);
run;
data result;
set result;
if obs<&obs. then y=&n2.;
else y=y;
run;


data z;
set er;
if z=&n3.;
run;
data z;
set z;
obs1=_n_;
if obs1=1;
call symput('obs',obs);
run;
data result;
set result;
if obs<&obs. then z=&n3.;
else z=z;
run;


data j;
set er;
if j=&n4.;
run;
data j;
set j;
obs1=_n_;
if obs1=1;
call symput('obs',obs);
run;
data result;
set result;
if obs<&obs. then j=&n4.;
else j=j;
run;

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

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