楼主: sherrysmile
1657 4

[原创博文] 请教如何把不同的代码分类到刚整理到不同的种类里 [推广有奖]

  • 0关注
  • 0粉丝

高中生

87%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
199 点
帖子
31
精华
0
在线时间
25 小时
注册时间
2011-5-2
最后登录
2011-12-18

楼主
sherrysmile 发表于 2011-12-2 08:15:50 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现有名为SIC的几千个代码,sample 如下:
SIC
4920
6710
6020
6020
3714.
.
.
并且有另一文件定义了不同种类的范围,文件数据如下:
"1"     0100-0999
          2000-2399
          2700-2749
          2770-2799
          3100-3199
          3940-3989

"2"     2500-2519
          2590-2599
          3630-3659
          3710-3711
          3714-3714
          3716-3716
          3750-3751
          3792-3792
          3900-3939
          3990-3999

"3"     2520-2589
          2600-2699
          2750-2769
          3000-3099
          3200-3569
          3580-3629
          3700-3709
          3712-3713
          3715-3715
          3717-3749
          3752-3791
          3793-3799
          3830-3839
          3860-3899
"4"     1200-1399
          2900-2999
"5"     2800-2829
          2840-2899
"6"     4900-4949
"7"     6000-6999
.
等一共12个种类。现想另作一列“category”, 把SIC代码分类到相对应的种类里:如下所示
SIC              category
4920               6
6710               7
6020               7
6020               7
3714               2
.
.
例如SIC 4940 对应的种类是“6” ,6710对应的种类是"7" 以此类推. 不确定用什么代码来编写。想着是否用if then语句来赋值,但由于种类的范围太多 如果用if SIC <= ” “then  category = ” “ 之类的代码来写是不是太麻烦了。请教高手们有没有什么方法来达到这个分类的目的呢?万分感谢!!
二维码

扫码加我 拉你入群

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

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

关键词:Category Sample Then AMPL SIC 如何 种类

本帖被以下文库推荐

沙发
soporaeternus 发表于 2011-12-2 10:51:30
FORMAT做,前期FMT的生成代码视对应规则的原数据复杂程度做对应修改。包括SIC的变量类型之类的......
  1. data a;
  2.         retain label;
  3.         input x:$1.;
  4.         fmtname="C";
  5.         y=compress(_infile_);
  6.         if substr(y,1,1)='"' then do;
  7.                 label=scan(y,1,'"-');
  8.                 start=input(scan(y,2,'"-'),4.);
  9.                 end=input(scan(y,3,'"-'),4.);
  10.         end;
  11.         else do;
  12.                 start=input(scan(y,1,'"-'),4.);
  13.                 end=input(scan(y,2,'"-'),4.);
  14.         end;
  15.         keep fmtname start end label;
  16.         datalines;
  17. "1"     0100-0999
  18.            2000-2399
  19.            2700-2749
  20.            2770-2799
  21.            3100-3199
  22.            3940-3989
  23. "2"     2500-2519
  24.            2590-2599
  25.            3630-3659
  26.            3710-3711
  27.            3714-3714
  28.            3716-3716
  29.            3750-3751
  30.            3792-3792
  31.            3900-3939
  32.            3990-3999
  33. "3"     2520-2589
  34.            2600-2699
  35.            2750-2769
  36.            3000-3099
  37.            3200-3569
  38.            3580-3629
  39.            3700-3709
  40.            3712-3713
  41.            3715-3715
  42.            3717-3749
  43.            3752-3791
  44.            3793-3799
  45.            3830-3839
  46.            3860-3899
  47. "4"     1200-1399
  48.            2900-2999
  49. "5"     2800-2829
  50.            2840-2899
  51. "6"     4900-4949
  52. "7"     6000-6999
  53. ;
  54. run;
  55. proc format cntlin=a;run;quit;
  56. data _null_;
  57.         input SIC;
  58.         c=put(sic,c.);
  59.         put sic= c=;
  60.         datalines;
  61. 4920               
  62. 6710               
  63. 6020               
  64. 6020               
  65. 3714   
  66. 320
  67. ;
  68. run;
复制代码
Let them be hard, but never unjust

藤椅
baoaibaobao 发表于 2011-12-2 11:20:38
  1. DATA SIC;
  2. INPUT SIC;
  3. CARDS;
  4. 4920
  5. 6710
  6. 6020
  7. 6020
  8. 3714
  9. ;
  10. DATA SIC_RANGE;
  11. INPUT NUMBER $1-3 RANGE $9-20;
  12.         RETAIN NUM;
  13.         IF NOT MISSING(NUMBER) THEN NUM=NUMBER;
  14. CARDS;
  15. "1"     0100-0999
  16.           2000-2399
  17.           2700-2749
  18.           2770-2799
  19.           3100-3199
  20.           3940-3989
  21. "2"     2500-2519
  22.           2590-2599
  23.           3630-3659
  24.           3710-3711
  25.           3714-3714
  26.           3716-3716
  27.           3750-3751
  28.           3792-3792
  29.           3900-3939
  30.           3990-3999
  31. "3"     2520-2589
  32.           2600-2699
  33.           2750-2769
  34.           3000-3099
  35.           3200-3569
  36.           3580-3629
  37.           3700-3709
  38.           3712-3713
  39.           3715-3715
  40.           3717-3749
  41.           3752-3791
  42.           3793-3799
  43.           3830-3839
  44.           3860-3899
  45. "4"     1200-1399
  46.           2900-2999
  47. "5"     2800-2829
  48.           2840-2899
  49. "6"     4900-4949
  50. "7"     6000-6999
  51. ;
  52. PROC SQL;
  53. CREATE TABLE TEST AS
  54.         SELECT A.SIC,COMPRESS(B.NUM,'"') AS CATEGORY FROM SIC A
  55.                 LEFT JOIN SIC_RANGE B ON A.SIC GE INPUT(SCAN(RANGE,1,'-'),4.)
  56.                 AND A.SIC LE INPUT(SCAN(RANGE,2,'-'),4.);
  57. QUIT;
复制代码

板凳
bobguy 发表于 2011-12-2 12:43:01
This is a good example to use a SAS format making a lookup table. See example below.

data t1;
length cat2 $3 sic $9;
retain cat;
infile cards;
input cat2 1-6 sic 7-20;
if cat2 ne  ' ' then cat=compress(cat2,'"');
if sic ne ' ' then output;
cards;
"1"       0100-0999
          2000-2399
          2700-2749
          2770-2799
          3100-3199
          3940-3989

"2"       2500-2519
          2590-2599
          3630-3659
          3710-3711
          3714-3714
          3716-3716
          3750-3751
          3792-3792
          3900-3939
          3990-3999

"3"       2520-2589
          2600-2699
          2750-2769
          3000-3099
          3200-3569
          3580-3629
          3700-3709
          3712-3713
          3715-3715
          3717-3749
          3752-3791
          3793-3799
          3830-3839
          3860-3899
"4"       1200-1399
          2900-2999
"5"       2800-2829
          2840-2899
"6"       4900-4949
"7"       6000-6999
;

proc print;run;

data _null_;
  set t1 END=END;
  if _n_=1 then call execute('PROC FORMAT LIBRARY=WORK; VALUE SIC2CAT');
  call execute(SIC||'='||CAT);
  IF END THEN call execute(';RUN;');
RUN;

DATA NEED;
INPUT SIC ;
category=PUT(SIC,SIC2CAT.);
CARDS;
4920              
6710              
6020              
6020              
3714              
;

PROC PRINT;RUN;

报纸
sherrysmile 发表于 2011-12-2 13:30:07
非常感谢楼上三位的解答 越来越觉得sas学好了真的挺有用的!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 10:34