楼主: hqs811
1494 6

另一种数据查询,读了sql手册没有找到办法,求助 [推广有奖]

  • 3关注
  • 0粉丝

硕士生

59%

还不是VIP/贵宾

-

威望
0
论坛币
1926 个
通用积分
28.2825
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
1051 点
帖子
76
精华
0
在线时间
210 小时
注册时间
2011-10-11
最后登录
2024-3-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
数据大概是这样的


Name      Year     work_1985    work_1986    work_1987   work_1988 ....... work_1999  work 2000
Henry      1993         Firm A          Firm A            FirmB             FirmB ...               Firm B          Firm C
Jack         1988         Firm D         Firm D            Firm D           FirmA.....              Firm A          Firm A
Dennis      2000        Firm C          Firm C           Firm C             FirmC ...              Firm C          Firm C
...


Name是姓名
year是年份
work_xx 是在XX年此人的工作地点, 从1985 到 2000.



由于大多数人的工作地点(work_xx)是变化的,
现在想做的是: 对每个observation(每个人)生成一个新的变量 working_firm, 定义在year指定年份内的工作地点。

这个问题和sql 一般where不同的是,条件在变量名字里(也就是column head里),不知道大家有什么办法没有。

先谢谢了!


二维码

扫码加我 拉你入群

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

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

关键词:数据查询 sql observation observat working 姓名

沙发
huntdreamer 发表于 2014-7-25 11:00:57 |只看作者 |坛友微信交流群
可以转置一下再做处理

使用道具

藤椅
freerunning_sky 在职认证  发表于 2014-7-25 11:09:53 |只看作者 |坛友微信交流群
  1. data out;
  2.         set in;
  3.         array work_f(*) $ work_1985-work_2000;
  4.         if year>=1985 & year<=2000 then working_firm=work_f(year-1984);
  5. run;
  6.        
复制代码

使用道具

板凳
hqs811 发表于 2014-7-25 22:25:25 |只看作者 |坛友微信交流群
freerunning_sky 发表于 2014-7-25 11:09
。。。。。。。。。。。。。。。。。。。

使用道具

报纸
hqs811 发表于 2014-7-26 01:25:57 |只看作者 |坛友微信交流群
freerunning_sky 发表于 2014-7-25 11:09
谢谢您的帮助,我试了试这个code,发现第四行引用array的时候会出现:

The function work_f is unknown, or cannot be accessed.

好像是array引用的问题?我搜了搜也没有什么头绪,可以再指点吗?

使用道具

地板
freerunning_sky 在职认证  发表于 2014-7-26 10:35:40 |只看作者 |坛友微信交流群
hqs811 发表于 2014-7-26 01:25
谢谢您的帮助,我试了试这个code,发现第四行引用array的时候会出现:

The function work_f is unknown ...
程序没有问题,不知道你是怎么写的
  1. data in;
  2.         input name :$10. year work_1985 :$15. work_1986 :$15. work_1990 :$15. work_1999 :$15. work_2000 :$15.;
  3.         cards;
  4.         Henry 1986 firmA firmA firmB firmB firmC
  5.         Jack 1999 firmC frimB firmB firmF firmZ
  6.         Dennis 1990 frimD firmF frimA firmH firmS
  7.         ;
  8. run;

  9. data out;
  10.         set in;
  11.         array work_f(*) $ work_1985-work_2000;
  12.         if year>=1985 & year<=2000 then working_firm=work_f(year-1984);
  13. run;
复制代码

使用道具

7
bobguy 发表于 2014-7-27 10:36:26 |只看作者 |坛友微信交流群
Take a look the following example if it solves your problem.

data tmp;
length Name   $10   Year  8   work_1985    work_1986    work_1987    $5;
infile cards truncover;
input Name      Year     work_1985    work_1986    work_1987   ;
cards;
Henry      1993         FirmA          FirmA            FirmB   
Jack         1988         FirmD         FirmD            FirmD  
Dennis      2000        FirmC          FirmC           FirmC
;

data tmp2;
  set tmp;
  array work_year(*) work_1985    work_1986    work_1987;
  do i=1 to dim(work_year);
     working_firm=catx('-',substr(vname(work_year(i)),6,4),work_year(i));
     output;
  end;
  keep name year working_firm;
  run;

  proc print;run;

使用道具

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

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

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

GMT+8, 2024-4-28 11:26