楼主: rockfido
3451 14

[原创博文] 请教一个SAS数据处理的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:1754份资源

博士生

32%

还不是VIP/贵宾

-

威望
0
论坛币
2715 个
通用积分
0.0341
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
4441 点
帖子
201
精华
0
在线时间
202 小时
注册时间
2008-8-29
最后登录
2024-11-1

楼主
rockfido 在职认证  发表于 2010-7-16 22:45:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如下的数据:

NAME TYPE
A    1
A    1
A    2
B    1
C    1
C    3
C    2

请问我如何可以得到这个DATA SET呢?
NAME TYPE  TYPEALL
A    1     112
A    1     112
A    2     112
B    1     1
C    1     132
C    3     132
C    2     132

就是想要多一个变量,这个变量是把同样NAME的人的TYPE都连接到一起。

觉得应该用RETAIN, FIRST.NAME来做,可是能力有限,做不出来。。。

请教大家
二维码

扫码加我 拉你入群

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

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

关键词:sas数据处理 数据处理 RETAIN First name 能力 如何 数据分析专题 数据处理 数据分析软件 数据分析报告 面板数据分析 excel数据分析 数据分析方法 项目数据分析

回帖推荐

wkn1986 发表于9楼  查看完整内容

data wkn; input name $ type $; cards; A 1 A 1 A 2 B 1 C 1 C 3 C 2 ; run; data wkn1; set wkn nobs=n; by name; retain typeall; if first.name then do; k=1; do i=1 to n; set wkn(rename=(name=na type=ty)) point=i; if (name=na) and (k=1) then do; typeall=ty; k=k+1;end; else if(name=na) and (k>1) then do; typeall=compress(typeall||ty);end; end;end; drop na t ...

本帖被以下文库推荐

沙发
crackman 发表于 2010-7-16 23:34:00
data crackman;
input NAME $ TYPE@;
datalines;
A    1
A    1
A    2
B    1
C    1
C    3
C    2
;
run;
data test(drop=s);
do until(last.name);
set test;
by name;
  length newstring $2000;
retain newstring;
newstring = COMPRESS(newstring)||COMPRESS(TYPE);
if last.name then s=newstring;
end;
do until(last.name);
set test;
by name;
newstring=s;
output;
end;
run;

藤椅
BraveMadMan 发表于 2010-7-16 23:37:55
crackman 发表于 2010-7-16 23:34
data crackman;
input NAME $ TYPE@;
obs=_n_;
datalines;
A    1
A    1
A    2
B    1
C    1
C    3
C    2
;
run;
data crackman;
set crackman;
do ;
if trim(name)="A" then TYPEALL=112;
else if trim(name)="B" then TYPEALL=1;
else if trim(name)="C" then TYPEALL=132;
end;
run;
这段程序也太离奇了吧?!

板凳
crackman 发表于 2010-7-16 23:50:39
我也感觉有点离奇

报纸
crackman 发表于 2010-7-16 23:51:28
根本不需要DO END

地板
rockfido 在职认证  发表于 2010-7-16 23:52:35
......but i have thousands of names instead of just a, b,c and more than just 1,2,3 types......

but thank you all the same!

7
BraveMadMan 发表于 2010-7-17 00:07:14
rockfido 发表于 2010-7-16 23:52
......but i have thousands of names instead of just a, b,c and more than just 1,2,3 types......

but thank you all the same!
对data不是很熟。借用版主的程序,抛砖引玉一个吧

data crackman;
input NAME $ TYPE@;
obs=_n_;
datalines;
A    1
A    1
A    2
B    1
C    1
C    3
C    2
;
run;

data test (drop=obs);
  set crackman;
  length newstring $2000;
by name;
  retain newstring;
if first.name then newstring='';

  newstring = COMPRESS(newstring)||COMPRESS(TYPE);
run;

8
BraveMadMan 发表于 2010-7-17 00:24:58
终于整明白了

data crackman;
input NAME $ TYPE@;
ID=_n_;
datalines;
A    1
A    1
A    2
B    1
C    1
C    3
C    2
;
run;

* Sequentially concatenate multiple rows;
data test;
  set crackman;
  length newstring $2000;
  by name;

  retain newstring;
  if first.name then newstring='';
  newstring = COMPRESS(newstring)||COMPRESS(TYPE);
run;

* Prepare data;
proc sort data=test; by name descending ID; run;

* Assign last observation in each group to newtype;
data test (drop=newstring); set test;
  by name;
  retain newtype;
  if first.name then newtype=input(newstring,best7.);
  run;

* Restore original order;
proc sort data=test out=test(drop=ID); by ID;

proc print; run;





                                  Obs    NAME    TYPE    newtype

                                   1      A        1       112
                                   2      A        1       112
                                   3      A        2       112
                                   4      B        1         1
                                   5      C        1       132
                                   6      C        3       132
                                   7      C        2       132

9
wkn1986 发表于 2010-7-17 10:10:49
data wkn;
input name $ type $;
cards;
A    1
A    1
A    2
B    1
C    1
C    3
C    2
;
run;
data wkn1;
set wkn nobs=n;
by name;
retain typeall;
if first.name then do;
k=1;
do i=1 to n;
set wkn(rename=(name=na type=ty)) point=i;
if (name=na) and (k=1) then do;
typeall=ty;
k=k+1;end;
else if(name=na) and (k>1) then do;
typeall=compress(typeall||ty);end;
end;end;
drop na ty k;
run;
已有 2 人评分学术水平 热心指数 收起 理由
BraveMadMan + 1 + 1 我很赞同
crackman + 1

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

10
BraveMadMan 发表于 2010-7-17 23:27:19
9# wkn1986

佩服全用data解决。

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

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