全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2795 10
2020-04-20
悬赏 20 个论坛币 已解决
我有如下数据:

Study_ID

A01ab

A02ab

A03ab

A04ab

B01ab

B02ab

1

1

0

0

0

0

0

1

0

0

1

0

0

0

1

0

0

0

0

1

0

2

1

0

0

0

0

0

2

0

1

0

0

0

0

原始数据中A01ab,A02ab,A03ab,A04ab,B01ab,B02ab这些变量的值,每一行只可能有一个值为1
想输出如下结果:

Study_ID

A01ab

A02ab

A03ab

A04ab

B01ab

B02ab

1

1

0

1

0

1

0

2

1

1

0

0

0

0



同一个StudyID的A01ab,A02ab,A03ab,A04ab,B01ab,B02ab这些变量的值同时相加(其实就是取这些变量中所有为1的值)并且输出一行观测值

最佳答案

逍遥梦蝶 查看完整内容

重新学习array,又写了一遍。 我的编程思路大致如下: [*]因为最后只要individual level的数据集,而原始数据集的结构属于“multipl rows for an individual”,可以使用 LAST. 功能在每一组的最后一行输出到数据集即可。 [*]利用 DATA 步按行循环处理的原理,对各列进行累计加总。一旦每组最后一行的累加值大于0,即说明该列中有取值为 1 的情况。因为需要累加,所以用到了 SUM 语句。建议先不加“ if last.study_ID the ...
二维码

扫码加我 拉你入群

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

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

全部回复
2020-4-20 18:31:28
重新学习array,又写了一遍。

复制代码

我的编程思路大致如下:
  • 因为最后只要individual level的数据集,而原始数据集的结构属于“multipl rows for an individual”,可以使用 LAST. 功能在每一组的最后一行输出到数据集即可。
  • 利用 DATA 步按行循环处理的原理,对各列进行累计加总。一旦每组最后一行的累加值大于0,即说明该列中有取值为 1 的情况。因为需要累加,所以用到了 SUM 语句。建议先不加“ if last.study_ID then output; ” 这一句,查看生成的数据集是否正确,以便验证编程的逻辑。
  • 最后按需整理数据集,保留所需变量。
二维码

扫码加我 拉你入群

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

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

2020-4-20 19:38:02
数据输入代码如下
data a;
input study_ID A01ab A02ab A03ab A04ab B01ab B02ab;
cards;
1 1 0 0 0 0 0
1 0 0 1 0 0 0
1 0 0 0 0 1 0
2 1 0 0 0 0 0
2 0 1 0 0 0 0
;
二维码

扫码加我 拉你入群

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

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

2020-4-20 19:39:30
SAS小白,还望各位大神不吝赐教感谢!
二维码

扫码加我 拉你入群

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

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

2020-4-20 19:58:12
供参考:proc report data=a;
column study_ID (A01ab A02ab A03ab A04ab B01ab B02ab),sum;
define  study_ID/group;
ods output report=work.b(drop=_break_);
run;
二维码

扫码加我 拉你入群

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

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

2020-4-21 09:31:17
复制代码
代码有些长。肯定是可以有更简短的写法的,比如用数组。可是数组的用法还不是很熟悉,看有没有高手来修改一下使它变得更短。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群