楼主: reduce_fat
365 14

重金悬赏SAS array 问题 [推广有奖]

荣誉版主

海外论坛首席管理员

泰斗

25%

还不是VIP/贵宾

-

TA的文库  其他...

海外原创经济论文和写作技巧

威望
11
论坛币
3567509 个
通用积分
33978.7033
学术水平
6811 点
热心指数
7170 点
信用等级
6642 点
经验
1322 点
帖子
11989
精华
78
在线时间
1842 小时
注册时间
2011-6-13
最后登录
2024-4-20

一级伯乐勋章 初级热心勋章 初级学术勋章 中级热心勋章 中级学术勋章 高级学术勋章 初级信用勋章 特级学术勋章 高级热心勋章 中级信用勋章 特级热心勋章 高级信用勋章 特级信用勋章

300论坛币
原始数据original data  
Original Data.xls (8.74 MB)


期望结果expected result   Expected Result.xlsx (104 KB)


楼主试验用Excel 里的array 来解决以下问题, 但是实施起来特别麻烦,因为要paste array 公式好几十次。 比如说这是北美的邮政编码数据。我想要从中筛选Texas州的部分城市的所有邮政编码zip code。 但是我只要部分城市的所有邮政编码的数据。这些邮政编码要单独列出像这个筛选后的表格一样。我把texas州的所有zip codes 单独列到一个原始数据的tab里叫zip codes。因为我不会用那个原始数据里的zip codes, 因为那个不一定全面,就把这个单独的zip codes tab 当做是全面的Texas zip code表格吧, 为了显示不同,我只是把原有的texas的所有zip codes 都加了一,然后另存到一个tab里,为了看sas筛选后的效果。 

现在需要把这些数据分别在sas里建立原始数据 。比如original_data.sas(这个太大只建立就好,不用打开,最好能用sql建立), 我已经在Excel里筛选到texas州的数据了,为了以后更新方便,还是去掉筛选,把所有的原始数据输入到SAS里, 然后用where 语句提取texas或者是任何一个州的相关数据, 要变量城市primary city, 看原始数据C列,县county,看原始数据 G 列, 注意不能用 A 列的zip,而是用另一个单独的zip code tab里的zip codes 数据(这个是规定使用的zip code 资源,所以要单独放到一个sas 数据里,然后再用data step加到输入到sas 里的原始数据中。 那个州的变量是state 看原始数据F列,texas的代号是TX。 

提取texas的数据后,要从所有城市里提取所需要的部分城市的数据。这个恐怕paste不容易因为每个城市都要单独在SAS里加引号。我当初是把所有城市先弄个pivot table 然后再把部分需要的城市paste 到旁边,在Excel 里筛选的zip codes。 但是太耗时间了。 

SAS产生的结果我也要它列成这个附件里的格式  sas里用proc contents 应该可以解决名字问题,所以在输入数据到sas时可以把 H 列以前的pivot table 和city列都删除。 从H列开始是所需的部分城市。把它们每个城市所对应的所有zip codes从原始数据里找出来,并帖到城市所在名的下边排成一列一列的。这H-J列的zip codes只是个例子不是筛选出来的,所以用SAS arrary用原始数据里先筛选出部分所需城市,然后再从另一个单独的zip code tab 里筛选出所对应的每个所需城市的所有zip codes。 

先把上边的问题解决,下边的能解决更好。金币不是问题。解答最详细的且能正确操作产生所需结果的版友将获得最终奖励。  

我还要county 这个可以在Excel 里实现,但是要能一块用sas做了最好。 举个例子。以下三个县county是从德州的原始数据里提取的。现在我要把每个county里面所有的城市和每个城。 市的zip codes都找出来也和上边城市列zip codes的格式一样,把每个county的所有zip codes做成一列一列的。 



Dallas County
Denton County
Collin County


SAS 要能把county 筛选成下边这个形式就足够好了, 我可以在Excel里进行近一步有针对性的筛选。 

Dallas County

city1

73256

city2

73156

city3

73542

city3

75251

city1

72291

city2

72952

city2

724928


注解:

这个资料里所用的邮政编码和我所用的另一个资源(特别大)里的邮政编码是不同的,所以我才另外建立了一个tab 叫zip code 把Texas的所有zip code作为一个例子放在这个tab里。为了和原始数据里的zip code 区分我就把这个tab里的zip code 都在原始zip code的基础上加了一。 你在原始数据的Excel里的第二个tab 里一查就可以看出来。 

我想看的是SAS array 筛选过程,现在把数据上传到原帖中了。 

要不然在Excel里一个个筛选在排成我在expected result H 列以后 的那种格式太麻烦了。比如让你做几百次。所以用SAS array应该可以产生一个整个 的output table 就像我描述的expect result一样。 

我只是用sas做部分分析,剩下的要在excel里做。 如果能直接提取我早就弄了,但是我用的zip code 是另一个资源里的特别大,和帖子里的原始数据类似,但略有不同。 

但我要的结果是只能拿原始数据里的城市,去搜集另一个数据里的zip codes然后划分到每个所需的城市里。因为另一个资源里的城市数据出错了,但是zip codes是对的。但我只能用另一个资源里的zip codes, 这是规则。 听起来很麻烦,所以要求大神帮忙。 

最佳答案

yongyitian 查看完整内容

下面程序用到的数据都是由original_data得到的。 数据中有两个字的城市名,不能作变量名,所以用了label来显示。 最后一段程序用到了array。
关键词:重金悬赏 Data step county Dallas 用excel Excel
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999
沙发
yongyitian 发表于 2015-1-21 10:34:13 |只看作者 |坛友微信交流群
下面程序用到的数据都是由original_data得到的。

数据中有两个字的城市名,不能作变量名,所以用了label来显示。
最后一段程序用到了array。

  1. PROC IMPORT OUT= WORK.original
  2.      DATAFILE= "C:\Temp\Original_Data.xls"
  3.             DBMS=EXCEL REPLACE;
  4.      SHEET="original_data$";
  5.      GETNAMES=YES;
  6.      MIXED=NO;
  7.      SCANTEXT=YES;
  8.      USEDATE=YES;
  9.      SCANTIME=YES;
  10. RUN;


  11. proc sql;  
  12.     create table texas as   
  13.      select distinct zip,  state, primary_city, county
  14.         from original
  15.         where state = "TX"
  16.         order by primary_city, zip, county;
  17. quit;

  18. data texas_small;      /* create a small table for testing */
  19.     set texas (obs=20);
  20. run;

  21. proc sql noprint;
  22.     select count(distinct Primary_city) into: n_city from texas_small;
  23.     select max(a.n_zip)  into : max_nzip
  24.      from (select count(zip) as n_zip
  25.            from texas_small
  26.            group by primary_city) as a;
  27. quit;

  28. proc sql;
  29.     create table primary_city as
  30.     select distinct primary_city as city from texas_small order by primary_city;
  31.     select cats("city", monotonic(),"=", "'", city, "'") into: label_city         

  32.         separated by ' '
  33.     from primary_city;
  34. quit;

  35. data want;
  36.     array city {&n_city} $20. ;
  37.     array temp{&n_city, &max_nzip};
  38.     set texas_small end=last;
  39.       by primary_city;
  40.     label &label_city;
  41.     retain i_city 0 temp:;

  42.     if first.primary_city then do;
  43.         i_city + 1 ; i_zip=1;
  44.          end;
  45.      temp[i_city, i_zip]= zip;
  46.          i_zip + 1;
  47.      if last then do;
  48.         do k1 = 1 to &max_nzip;
  49.           do k2 = 1 to &n_city;
  50.             city[k2] = temp[k2,k1];
  51.           end;
  52.         output;
  53.         end;         
  54.       end;
  55.      drop i_city i_zip  k1 k2 temp: zip state primary_city county;
  56. run;
复制代码
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
reduce_fat + 100 + 5 + 5 + 5 观点有启发

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

使用道具

藤椅
sushe1527 发表于 2015-1-21 10:39:00 |只看作者 |坛友微信交流群
  1. 主要是思路,其实楼主可以随便举个简单例子,想生成什么样要求写出就行了,你这样说了很多其实没啥直观性
  2. ps 楼主上次的金币已到账 大家踊跃参加
复制代码

使用道具

板凳
reduce_fat 发表于 2015-1-21 10:40:48 |只看作者 |坛友微信交流群
sushe1527 发表于 2015-1-21 10:39
这是个实际问题。需要好好想想,我想用array解决但用的不熟练,做不出想要的结果。 excel里我会,但是太慢了。 数据上传出现问题要等一下。 

使用道具

报纸
sushe1527 发表于 2015-1-21 10:43:55 |只看作者 |坛友微信交流群
还有,就本例来说 这个城市和邮编的对应关系
我想,某些网站上应该有整理好的,提取出来就行了

使用道具

地板
reduce_fat 发表于 2015-1-21 10:52:36 |只看作者 |坛友微信交流群
sushe1527 发表于 2015-1-21 10:43
还有,就本例来说 这个城市和邮编的对应关系
我想,某些网站上应该有整理好的,提取出来就行了
这个资料里所用的邮政编码和我所用的另一个资料里的邮政编码是不同的,所以我才另外建立了一个tab 叫zip code 把Texas的所有zip code作为一个例子放在这个tab里。为了和原始数据里的zip code 区分我就把这个tab里的zip code 都在原始zip code的基础上加了一。 你在Excel里一查就可以。 
我想看的是SAS array 筛选过程,现在把数据上传到原帖中了。 

要不然在Excel里一个个筛选在排成我在expected result H 列以后 的那种格式太麻烦了。比如让你做几百次。所以用SAS array应该可以产生一个整个 的output table 就像我描述的expect result一样。 

我只是用sas做部分分析,剩下的要在excel里做。 如果能直接提取我早就弄了,但是我用的zip code 是另一个资源里的特别大,和帖子里的原始数据类似,但略有不同。 

但我要的结果是只能拿原始数据里的城市,去搜集另一个数据里的zip codes然后划分到每个所需的城市里。因为另一个资源里的城市数据出错了,但是zip codes是对的。但我只能用另一个资源里的zip codes, 这是规则。 听起来很麻烦,所以要求大神帮忙。 

使用道具

7
sas9.4 发表于 2015-1-21 16:45:26 |只看作者 |坛友微信交流群
这个问题应该是不难的。如果是我用sql就可以了,然后proc transpose转置一下。只是楼主的语言表述实在无法让人明白你的目的

使用道具

8
reduce_fat 发表于 2015-1-21 22:45:18 |只看作者 |坛友微信交流群
sas9.4 发表于 2015-1-21 16:45
这个问题应该是不难的。如果是我用sql就可以了,然后proc transpose转置一下。只是楼主的语言表述实在无法让 ...
我不常用 中文 描述这种问题,其实比较简单,但是另一个资源不能上传,有空的时候我会再把表述简单化一些。其实就是 从另一个不能上传的资源里提取所需的 zip codes (正确的),因为那里面部分城市分配错误或者根本不存在或者数据错误,但那是要求使用的资源。没办法我又从网上找到了新资源在帖子里叫 原始数据,看主题附件。

这样我用主题附件里的 城市名字和另一个资源里 的zip codes, 合并筛选出每个所需城市的所对应的 所有 zip codes。 我说的所需城市是我已经在Excel 里 筛选完毕的 城市,这里 只随便举了个 例子,没用真名。

但一定要横向排列,每列的名字是城市名然后 在城市名下边自动把所有的能找到的对应的zip codes 加进去。 这样SAS做 一个 output table应该就可以,missing的就不管了 ,因为这个 原始数据,毕竟和我用的另一个zip code资源有一些不同。有mismatch的 不奇怪。

还有 城市找完了 zip code, 我还想接着找county 也就是县或郡以内所有城市和其所对应的 所有zip code,这个如果少就用 Excel 筛选,多了还得用sas弄节约时间。 这个county 我也有个 list , 没放到这里 。

先把城市和 zip codes 连接的问题解决才行。明白了吗? 谢谢。

使用道具

9
reduce_fat 发表于 2015-1-23 11:59:13 |只看作者 |坛友微信交流群
yongyitian 发表于 2015-1-22 08:45
下面程序用到的数据都是由original_data得到的。

数据中有两个字的城市名,不能作变量名,所以用了labe ...
这个不错,我给出的信息毕竟有限。 今天我花了一天时间在Excel 里把这个分析过程全部搞定,不论哪个州都可以解决。但关键是比较麻烦,设计好后更新就容易多了。

但是我还是希望可以把它在SAS了涮一下,出来直接达到90%以上理想的结果。你的code 我可以稍做修改再试验一下。先不设置最佳,因为可能还有后续问题。 不过你要缺少金币,可以到这个留学10区  回帖,记得把这个帖子加进去。 https://bbs.pinggu.org/forum.php?mod=viewthread&tid=3549579&extra=

我会给于更多的奖励的。 以后这个project还有跟进和补充的问题,全部解决后,我会设置最佳答案并再发奖励。 谢谢。

使用道具

10
zhengbo8 发表于 2015-1-23 13:19:38 |只看作者 |坛友微信交流群
可以不使用数组吗?我来试试。
已有 1 人评分经验 热心指数 收起 理由
reduce_fat + 22 + 3 鼓励积极发帖讨论

总评分: 经验 + 22  热心指数 + 3   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 15:18