0

我有一个类似于下面的数据集

ID  A   B  C  D  E
1   1
1          1
1       1
2       1
2             1
3                1
3   1
4          1
5       1

我想将每个 ID 的数据压缩成一行。所以数据集看起来像下面的那个。

ID  A   B  C  D  E
 1  1   1  1 
 2      1     1
 3  1            1
 4         1
 5      1

好吧,我创建了另一个表并删除了重复的 ID。所以我有两个表——A 和 B。然后我尝试将两个数据集合并在一起。我在玩下面的 SAS 代码。

data C; 
     merge A B; 
     by ID;
run; 
4

3 回答 3

2

这是我从另一个论坛中学到的一个巧妙的技巧。无需拆分原始数据集,第一个更新语句创建结构,第二个更新值。BY 语句可确保每个 ID 仅获得 1 条记录。

data have;
infile datalines dsd;
input ID  A   B  C  D  E;
datalines;
1,1,,,,,
1,,,1,,,
1,,1,,,,
2,,1,,,,
2,,,,1,,
3,,,,,1,
3,1,,,,,
4,,,1,,,
5,,1,,,
;
run;

data want;
update have (obs=0) have;
by id;
run;
于 2013-10-03T09:04:14.140 回答
0

这可以使用retain语句来解决。

data B(rename=(A2=A B2=B C2=C D2=D));
  set A;
  by id;
  retain A2 B2 C2 D2;
  if first.id then do;
    A2 = .;
    B2 = .;
    C2 = .;
    D2 = .;
  end;
  if A ne . then A2=A;
  if B ne . then B2=B;
  if C ne . then C2=C;
  if D ne . then D2=D;
  if last.id then output;
  drop A B C D;
run;

还有其他方法可以解决这个问题,但希望这会有所帮助。

于 2013-10-02T21:39:42.870 回答
0

PROC MEANS 是一个很好的工具。PROC SQL 也会给你一个合理的解决方案,但 MEANS 更快。

proc means data=yourdata;
var a b c d e;
class id;
types id; *to avoid the 'overall' row;
output out=yourdata max=; *output the maximum of each var for each ID - use SUM instead if you want more than 1;
run;
于 2013-10-03T03:40:19.653 回答