楼主: semenljw
3474 10

求助SAS BASE高手,找一个数据集的最近邻数据集 [推广有奖]

已卖:637份资源

教授

9%

还不是VIP/贵宾

-

威望
0
论坛币
14310 个
通用积分
49.1101
学术水平
56 点
热心指数
62 点
信用等级
46 点
经验
4920 点
帖子
504
精华
2
在线时间
1352 小时
注册时间
2008-12-12
最后登录
2025-11-7

楼主
semenljw 在职认证  发表于 2012-11-6 17:18:53 |AI写论文
50论坛币
想求出数据集observations的每个点(一个点对应一条记录)最近的5个点组成的数据集。老板只允许用SAS BASE实习,求高手帮助实现 ,以下是找一个给定点的5个最近点的程序,可供参考,谢谢!
data observations;
  do ID=1 TO 100000;
    x1 = RAND('NORMAL',0,1);
    x2 = RAND('NORMAL',0,1);
    x3 = RAND('NORMAL',0,1);
    output;
  end;
run;
%macro listOfKNN (obser , target, K, nameOutput);
%Let dim = %eval(%SYSFUNC(count(&target,%NRSTR( )))+1) ;
%let ttt =;
%DO ii = 1 %TO &dim;
  %let ttt = &ttt.(x&ii.-%scan(&target,&ii," "))**2;
  %IF &ii NE &dim %THEN
   %let ttt = &ttt.+;
%END;
proc sql noprint ;
    create table &nameOutput as
     select distinct *, sqrt(&ttt)as distance
     from &obser
     order by distance;
quit;
data &nameOutput;
    set &nameOutput (obs=&K);
  drop distance;
run;
%mend listOfKNN;


/*make a test*/
%listOfKNN( obser   = observations,
   target  = 0.5 1 1,
   K   =  5,
   nameOutput = out
);

关键词:SAS base Base 数据集 observations observation 记录

回帖推荐

ziyenano 发表于2楼  查看完整内容

data observations; do ID=1 TO 20; x1 = RAND('NORMAL',0,1); x2 = RAND('NORMAL',0,1); x3 = RAND('NORMAL',0,1); output; end; run; %macro listOfKNN (obser , target, K, nameOutput); %Let dim = %eval(%SYSFUNC(count(&target,%NRSTR( )))+1) ; %let ttt =; %DO ii = 1 %TO &dim; %let ttt = &ttt.(x&ii.-%scan(&target,&ii," "))**2; %IF &ii NE &dim %THEN %let ttt = &ttt ...

本帖被以下文库推荐

沙发
ziyenano 发表于 2012-11-6 22:37:39
data observations;
  do ID=1 TO 20;
    x1 = RAND('NORMAL',0,1);
    x2 = RAND('NORMAL',0,1);
    x3 = RAND('NORMAL',0,1);
    output;
  end;
run;
%macro listOfKNN (obser , target, K, nameOutput);
%Let dim = %eval(%SYSFUNC(count(&target,%NRSTR( )))+1) ;
%let ttt =;
%DO ii = 1 %TO &dim;
  %let ttt = &ttt.(x&ii.-%scan(&target,&ii," "))**2;
  %IF &ii NE &dim %THEN
   %let ttt = &ttt.+;
%END;
proc sql noprint ;
    create table temp as
     select distinct *, sqrt(&ttt)as distance
     from &obser
     order by distance;
quit;
data &nameOutput;
    set &nameOutput temp(obs=&K drop=distance);
run;
%mend listOfKNN;

data out;
set Observations;
if _n_=0;
run;
data _null_;
set Observations;
call execute('%listofknn(obser=observations,target='||compress(x1)||' '||compress(x2)||' '||compress(x3)||',k=5,nameoutput=out)');
run;
我用20个数据试验了一下,100000个数据程序估计要运行很长时间


已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
bakoll + 3 + 3 精彩帖子
数据分析师3K + 60 + 5 + 5 + 5 热心帮助其他会员

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

藤椅
semenljw 在职认证  发表于 2012-11-7 14:20:08
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不知道为什么?有其他方法吗?多谢多谢啊

板凳
semenljw 在职认证  发表于 2012-11-7 14:20:42
ziyenano 发表于 2012-11-6 22:37
data observations;
  do ID=1 TO 20;
    x1 = RAND('NORMAL',0,1);
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不知道为什么?有其他方法吗?多谢多谢啊

报纸
ziyenano 发表于 2012-11-7 14:28:17
semenljw 发表于 2012-11-7 14:20
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不 ...
宏中设定分隔符是空格,
catx连接的时候,设定连接符为空格;而且要用compress函数将x1...xn中的空格去掉;
catx(' ',compress(x1),compress(x2),....compress(xn));
或者将宏中分隔符改为@等其他字符,就不会与字段x1...xn中的空格冲突了。
已有 1 人评分论坛币 信用等级 收起 理由
数据分析师3K + 20 + 2 鼓励积极发帖讨论

总评分: 论坛币 + 20  信用等级 + 2   查看全部评分

地板
semenljw 在职认证  发表于 2012-11-7 21:55:57
ziyenano 发表于 2012-11-7 14:28
宏中设定分隔符是空格,
catx连接的时候,设定连接符为空格;而且要用compress函数将x1...xn中的空格去掉 ...
您好!ziyenano.下面的代码是目前做smote的初始想法,找出每条记录的临近5条记录,但上面的代码最后一个宏,还是有些问题,调了很久,感觉没问题,所以不知道问题出现在什么地方?可以麻烦您能帮我看看吗?真的很感谢您的帮忙!

7
semenljw 在职认证  发表于 2012-11-7 21:57:00
semenljw 发表于 2012-11-7 21:55
您好!ziyenano.下面的代码是目前做smote的初始想法,找出每条记录的临近5条记录,但上面的代码最后一个宏 ...
data iris;
input id sepal_length sepal_width petal_length petal_width species $;
cards;
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
6            5.4         3.9          1.7         0.4     setosa
7            4.6         3.4          1.4         0.3     setosa
8            5.0         3.4          1.5         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
10           4.9         3.1          1.5         0.1     setosa
11           5.4         3.7          1.5         0.2     setosa
12           4.8         3.4          1.6         0.2     setosa
13           4.8         3.0          1.4         0.1     setosa
14           4.3         3.0          1.1         0.1     setosa
15           5.8         4.0          1.2         0.2     setosa
16           5.7         4.4          1.5         0.4     setosa
17           5.4         3.9          1.3         0.4     setosa
18           5.1         3.5          1.4         0.3     setosa
19           5.7         3.8          1.7         0.3     setosa
20           5.1         3.8          1.5         0.3     setosa
21           5.4         3.4          1.7         0.2     setosa
22           5.1         3.7          1.5         0.4     setosa
23           4.6         3.6          1.0         0.2     setosa
24           5.1         3.3          1.7         0.5     setosa
25           4.8         3.4          1.9         0.2     setosa
26           5.0         3.0          1.6         0.2     setosa
27           5.0         3.4          1.6         0.4     setosa
28           5.2         3.5          1.5         0.2     setosa
29           5.2         3.4          1.4         0.2     setosa
30           4.7         3.2          1.6         0.2     setosa
31           4.8         3.1          1.6         0.2     setosa
32           5.4         3.4          1.5         0.4     setosa
33           5.2         4.1          1.5         0.1     setosa
34           5.5         4.2          1.4         0.2     setosa
35           4.9         3.1          1.5         0.2     setosa
36           5.0         3.2          1.2         0.2     setosa
37           5.5         3.5          1.3         0.2     setosa
38           4.9         3.6          1.4         0.1     setosa
39           4.4         3.0          1.3         0.2     setosa
40           5.1         3.4          1.5         0.2     setosa
41           5.0         3.5          1.3         0.3     setosa
42           4.5         2.3          1.3         0.3     setosa
43           4.4         3.2          1.3         0.2     setosa
44           5.0         3.5          1.6         0.6     setosa
45           5.1         3.8          1.9         0.4     setosa
46           4.8         3.0          1.4         0.3     setosa
47           5.1         3.8          1.6         0.2     setosa
48           4.6         3.2          1.4         0.2     setosa
49           5.3         3.7          1.5         0.2     setosa
50           5.0         3.3          1.4         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
53           6.9         3.1          4.9         1.5 versicolor
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor
57           6.3         3.3          4.7         1.6 versicolor
58           4.9         2.4          3.3         1.0 versicolor
59           6.6         2.9          4.6         1.3 versicolor
60           5.2         2.7          3.9         1.4 versicolor
61           5.0         2.0          3.5         1.0 versicolor
62           5.9         3.0          4.2         1.5 versicolor
63           6.0         2.2          4.0         1.0 versicolor
64           6.1         2.9          4.7         1.4 versicolor
65           5.6         2.9          3.6         1.3 versicolor
66           6.7         3.1          4.4         1.4 versicolor
67           5.6         3.0          4.5         1.5 versicolor
68           5.8         2.7          4.1         1.0 versicolor
69           6.2         2.2          4.5         1.5 versicolor
70           5.6         2.5          3.9         1.1 versicolor
71           5.9         3.2          4.8         1.8 versicolor
72           6.1         2.8          4.0         1.3 versicolor
73           6.3         2.5          4.9         1.5 versicolor
74           6.1         2.8          4.7         1.2 versicolor
75           6.4         2.9          4.3         1.3 versicolor
76           6.6         3.0          4.4         1.4 versicolor
77           6.8         2.8          4.8         1.4 versicolor
78           6.7         3.0          5.0         1.7 versicolor
79           6.0         2.9          4.5         1.5 versicolor
80           5.7         2.6          3.5         1.0 versicolor
81           5.5         2.4          3.8         1.1 versicolor
82           5.5         2.4          3.7         1.0 versicolor
83           5.8         2.7          3.9         1.2 versicolor
84           6.0         2.7          5.1         1.6 versicolor
85           5.4         3.0          4.5         1.5 versicolor
86           6.0         3.4          4.5         1.6 versicolor
87           6.7         3.1          4.7         1.5 versicolor
88           6.3         2.3          4.4         1.3 versicolor
89           5.6         3.0          4.1         1.3 versicolor
90           5.5         2.5          4.0         1.3 versicolor
91           5.5         2.6          4.4         1.2 versicolor
92           6.1         3.0          4.6         1.4 versicolor
93           5.8         2.6          4.0         1.2 versicolor
94           5.0         2.3          3.3         1.0 versicolor
95           5.6         2.7          4.2         1.3 versicolor
96           5.7         3.0          4.2         1.2 versicolor
97           5.7         2.9          4.2         1.3 versicolor
98           6.2         2.9          4.3         1.3 versicolor
99           5.1         2.5          3.0         1.1 versicolor
100          5.7         2.8          4.1         1.3 versicolor
101          6.3         3.3          6.0         2.5  virginica
102          5.8         2.7          5.1         1.9  virginica
103          7.1         3.0          5.9         2.1  virginica
104          6.3         2.9          5.6         1.8  virginica
105          6.5         3.0          5.8         2.2  virginica
106          7.6         3.0          6.6         2.1  virginica
107          4.9         2.5          4.5         1.7  virginica
108          7.3         2.9          6.3         1.8  virginica
109          6.7         2.5          5.8         1.8  virginica
110          7.2         3.6          6.1         2.5  virginica
111          6.5         3.2          5.1         2.0  virginica
112          6.4         2.7          5.3         1.9  virginica
113          6.8         3.0          5.5         2.1  virginica
114          5.7         2.5          5.0         2.0  virginica
115          5.8         2.8          5.1         2.4  virginica
116          6.4         3.2          5.3         2.3  virginica
117          6.5         3.0          5.5         1.8  virginica
118          7.7         3.8          6.7         2.2  virginica
119          7.7         2.6          6.9         2.3  virginica
120          6.0         2.2          5.0         1.5  virginica
121          6.9         3.2          5.7         2.3  virginica
122          5.6         2.8          4.9         2.0  virginica
123          7.7         2.8          6.7         2.0  virginica
124          6.3         2.7          4.9         1.8  virginica
125          6.7         3.3          5.7         2.1  virginica
126          7.2         3.2          6.0         1.8  virginica
127          6.2         2.8          4.8         1.8  virginica
128          6.1         3.0          4.9         1.8  virginica
129          6.4         2.8          5.6         2.1  virginica
130          7.2         3.0          5.8         1.6  virginica
131          7.4         2.8          6.1         1.9  virginica
132          7.9         3.8          6.4         2.0  virginica
133          6.4         2.8          5.6         2.2  virginica
134          6.3         2.8          5.1         1.5  virginica
135          6.1         2.6          5.6         1.4  virginica
136          7.7         3.0          6.1         2.3  virginica
137          6.3         3.4          5.6         2.4  virginica
138          6.4         3.1          5.5         1.8  virginica
139          6.0         3.0          4.8         1.8  virginica
140          6.9         3.1          5.4         2.1  virginica
141          6.7         3.1          5.6         2.4  virginica
142          6.9         3.1          5.1         2.3  virginica
143          5.8         2.7          5.1         1.9  virginica
144          6.8         3.2          5.9         2.3  virginica
145          6.7         3.3          5.7         2.5  virginica
146          6.7         3.0          5.2         2.3  virginica
147          6.3         2.5          5.0         1.9  virginica
148          6.5         3.0          5.2         2.0  virginica
149          6.2         3.4          5.4         2.3  virginica
150          5.9         3.0          5.1         1.8  virginica
;
run;

8
semenljw 在职认证  发表于 2012-11-7 21:57:33
semenljw 发表于 2012-11-7 21:57
data iris;
input id sepal_length sepal_width petal_length petal_width species $;
cards;
data test_data(keep=sepal_length sepal_width petal_length petal_width species_new);
set iris;
if species="setosa" then species_new=0;
else species_new=1;
run;

%let rate=%sysevalf(10/100);
proc surveyselect data=test_data(where=(species_new=0)) out=random_data_1 method=srs
                  samprate=&rate.;
run;

OPTIONS MPRINT MLOGIC SYMBOLGEN;
PROC CONTENTS DATA=random_data_1 OUT=ATTRIBUT NOPRINT;RUN;
PROC SORT DATA=ATTRIBUT;BY VARNUM;RUN;
DATA ATTRIBUT;
SET ATTRIBUT;
VARNUM_NEW=PUT(VARNUM,8.);
RUN;
PROC SQL NOPRINT;SELECT COUNT(*), NOBS INTO :DIM, :NOBS FROM ATTRIBUT;QUIT;
PROC SQL NOPRINT;
SELECT NAME INTO :VAR1-:VAR%LEFT(&DIM.)
FROM ATTRIBUT;
SELECT "VAR_"||COMPRESS(VARNUM_NEW) INTO :NEW1-:NEW%LEFT(&DIM.)
FROM ATTRIBUT;
QUIT;
%MACRO RENAME;
%DO I=1 %TO &DIM.;
&&VAR&I.=&&NEW&I.
%END;
%MEND RENAME;
PROC DATASETS LIB=WORK;
MODIFY RANDOM_DATA_1;
RENAME %RENAME;
RUN;
QUIT;

%MACRO LISTOFKNN(OBSER,TARGET,K,OUTPUT);
%LET TTT=;
%DO II=1 %TO &DIM.;
   %LET TTT=&TTT.(VAR_&II.-%SCAN(&TARGET.,&II.," "))**2;
   %IF &II NE &DIM. %THEN
   %LET TTT=&TTT.+;
%END;

PROC SQL NOPRINT;
CREATE TABLE &OUTPUT AS
SELECT DISTINCT *,SQRT(&TTT.) AS DISTANCE
FROM &OBSER.
ORDER BY DISTANCE;
QUIT;

DATA &OUTPUT;
SET &OUTPUT(OBS=&K.);
DROP DISTANCE;
RUN;
%MEND LISTOFKNN;

%macro vector();
%let nn=;
%let dimn=%eval(&dim.-1);
%DO ii= 1 %TO &dimn.;
  %let nn= &nn.||compress(var_&ii.)||" ";
  %IF &ii NE &dimn. %THEN
   %let nn= &nn.;
%END;
%let mm=&nn.||compress(var_%left(&dim.))||;
%put &mm.;
data out;
set random_data_1;
if _n_=0;
run;

data aa;
set random_data_1;
call execute("%listOfKNN(obser=random_data_1,
   TARGET="&mm.",K=5,Output = out)");
run;
%mend vector;
%vector;

9
semenljw 在职认证  发表于 2012-11-7 22:07:04
semenljw 发表于 2012-11-7 21:57
data test_data(keep=sepal_length sepal_width petal_length petal_width species_new);
set iris;
...
mm没有解析

10
perfbase 发表于 2012-11-29 11:03:30
ding ding ding

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

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