楼主: ttklkl
5290 13

[原创博文] 数据集变量值改变 [推广有奖]

  • 1关注
  • 6粉丝

博士生

85%

还不是VIP/贵宾

-

威望
0
论坛币
232 个
通用积分
2.0018
学术水平
11 点
热心指数
11 点
信用等级
8 点
经验
31591 点
帖子
119
精华
0
在线时间
609 小时
注册时间
2009-6-15
最后登录
2021-12-22

楼主
ttklkl 发表于 2011-3-14 20:22:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教大家一个问题:
数据集a:
data a;
input var $ center scrno pageno seqno;
cards;
height 1 1 4 1
height 1 1 5 1
weight 1 2 2 1
weight 1 2 5 1
vssbp  1 1 4 1
vssbp  1 1 5 1
;
run;



数据集b:
data b;
input height $ 1-20 weight $ 21-40 vssbp $ 41-60 ;
cards;
height is missing    weight is missing     vssbp is missing
;
run;



有什么方法使数据集a的变量var的值变成数据集b相应变量的值,即如下数据集c的形式: 不知宏能不能实现?各位大牛给给建议,谢谢!
数据集c:
height is missing     1 1 4 1
height is missing     1 1 5 1
weight is missing     1 2 2 1
weight is missing     1 2 5 1
vssbp is missing      1 1 4 1
vssbp is missing      1 1 5 1



二维码

扫码加我 拉你入群

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

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

关键词:数据集变量 数据集 变量值 请教大家一个问题 missing center

回帖推荐

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

试试!

本帖被以下文库推荐

沙发
baoaibaobao 发表于 2011-3-14 21:26:05
  1. data c(drop=height weight vssbp);
  2. length var $20.;
  3.         if _n_=1 then set b;
  4.         set a;
  5.         array bb(3) height weight vssbp;
  6.                 do i=1 to 3;
  7.                         if var=scan(left(bb(i)),1,'') then var=bb(i);
  8.                 end;
  9. run;
复制代码
试试!
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

藤椅
ttklkl 发表于 2011-3-14 21:45:30
非常感谢baoaibaobao 的code, 执行结果是正确的。
但是我的变量有一千多个,不方便写这样的语句:drop=height weight vssbp及array bb(3) height weight vssbp;
能否有更简单的方法来达到目的?
Stay Hungry. Stay Foolish.

板凳
baoaibaobao 发表于 2011-3-14 22:05:34
ttklkl 发表于 2011-3-14 21:45
非常感谢baoaibaobao 的code, 执行结果是正确的。
但是我的变量有一千多个,不方便写这样的语句:drop=height weight vssbp及array bb(3) height weight vssbp;
能否有更简单的方法来达到目的?
  1. data c;
  2. length var $20.;
  3.         if _n_=1 then set b;
  4.         set a;
  5.         array bb(*) _character_;
  6.                 do i=1 to dim(bb);
  7.                         if var=scan(left(bb(i)),1,'') then var=bb(i);
  8.                 end;
  9.                 keep var center scrno pageno seqno;
  10. run;
复制代码

报纸
ttklkl 发表于 2011-3-14 22:17:40
baoaibaobao 发表于 2011-3-14 22:05
ttklkl 发表于 2011-3-14 21:45
非常感谢baoaibaobao 的code, 执行结果是正确的。
但是我的变量有一千多个,不方便写这样的语句:drop=height weight vssbp及array bb(3) height weight vssbp;
能否有更简单的方法来达到目的?
  1. data c;
  2. length var $20.;
  3.         if _n_=1 then set b;
  4.         set a;
  5.         array bb(*) _character_;
  6.                 do i=1 to dim(bb);
  7.                         if var=scan(left(bb(i)),1,'') then var=bb(i);
  8.                 end;
  9.                 keep var center scrno pageno seqno;
  10. run;
复制代码
非常感谢baoaibaobao ,高手!
Stay Hungry. Stay Foolish.

地板
ttklkl 发表于 2011-3-15 12:31:46
再请教下baoaibaobao,如果数据集b是如下形式:不是数值前第一个单词是变量名,例如变量vssbp值是Blood Pressure (SBP) is missing. Please provide

data b;
input height $ 1-20 weight $ 21-40 vssbp $ 41-100 ;
cards;
height is missing    weight is missing     Blood Pressure (SBP) is missing. Please provide.;
run;


该怎么处理?谢谢!
Stay Hungry. Stay Foolish.

7
myc_sas 发表于 2011-3-15 22:54:02
根据我的理解,A表里面var的值是B表里相应变量的名字,需要把A表的值替换为相应B表该变量的值。
我写了个小程序如下:

proc sql noprint;
        select distinct var
        into :varA1-:varA3
        from a;
quit;

data _null_;
        set b;
        array bb(*) _character_;
        call symput("countvar", dim(bb));
        maxlen=0;
        do i=1 to dim(bb);
                maxlen=max(maxlen,lengthc(bb(i)));
        end;
        call symput("maxlength", maxlen);
run;

data c;
        length var $ &maxlength;
        set a;
run;

%macro update;
        proc sql;
                %do i=1 %to &countvar;
                        update c
                        set var=(select &&vara&i from b)
                        where var="&&vara&i";
                %end;
        quit;
%mend update;
%update
已有 1 人评分学术水平 热心指数 收起 理由
sopching + 1 + 1 发现阁下颇爱sql和宏。

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

8
ttklkl 发表于 2011-3-17 15:05:17
7# myc_sas

Thanks, great!
Stay Hungry. Stay Foolish.

9
david0 发表于 2011-3-18 11:28:48
试一试这个。
proc transpose data=b out=transb; var _all_; run;                                                                                       
proc sql;                                                                                                                              
select transb.COL1,center, scrno, pageno, seqno                                                                                         
from a left join transb on a.var=transb._name_                                                                                          
;                                                                                                                                       
quit;

10
ttklkl 发表于 2011-3-18 12:08:23
Thank you! 9# david0
Stay Hungry. Stay Foolish.

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

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