楼主: jackyloda
2915 19

[问答] 求助SAS有条件下的求和 [推广有奖]

  • 4关注
  • 0粉丝

大专生

8%

还不是VIP/贵宾

-

威望
0
论坛币
585 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
238 点
帖子
25
精华
0
在线时间
38 小时
注册时间
2012-12-20
最后登录
2016-10-6

楼主
jackyloda 发表于 2014-12-22 23:50:07 |AI写论文
5论坛币
目前导师的项目在编程运行时碰到了一下麻烦,望大神们帮忙解答下~

是这样的,数据集里有两个变量:A和B
A是一个0,1变量,现在希望求:所有A=1时相应B在这个位置的值与后5个的B的和。(即每当A=1时,先求这6个B的和,再把所有A=1的这个和再求和)
我想到的方法使用数组标识B,但是当A=1这个条件下B是数组第几个应该怎么表述呢?试了好多种方法都不行。

描述的不太好,各位大神将就着看下

最佳答案

ziyenano 查看完整内容

data ex; do i =1 to 100; a=round(ranuni(0),1); b=ranuni(0); output; end; drop i; run; proc iml; use ex; read all var{a b} into g; close ex; n=nrow(g); location=loc(g[,1]=1); res=j(ncol(location),1,0); do i=1 to ncol(location); res=g[location:min(location+5,n),2][+]; end; sum_res=res[+]; print sum_res;
关键词:数据集 项目

沙发
ziyenano 发表于 2014-12-22 23:50:08
data ex;
do i =1 to 100;
a=round(ranuni(0),1);
b=ranuni(0);
output;
end;
drop i;
run;

proc iml;
use ex;
read all var{a b} into g;
close ex;
n=nrow(g);
location=loc(g[,1]=1);
res=j(ncol(location),1,0);
do i=1 to ncol(location);
res[i]=g[location[i]:min(location[i]+5,n),2][+];
end;
sum_res=res[+];
print sum_res;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 3 + 3 + 3 观点有启发

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
jackyloda 发表于 2014-12-23 09:42:18
ziyenano 发表于 2014-12-23 00:32
data ex;
do i =1 to 100;
a=round(ranuni(0),1);
你好,第二段的代码我还不是太理解,你是一个什么思路呢,g是一个数组吗?

板凳
Tigflanker 发表于 2014-12-23 11:12:26
希望能给个sample,我们也可以照着做。

情况需要模拟的足够复杂些。

报纸
jackyloda 发表于 2014-12-23 11:23:18
Tigflanker 发表于 2014-12-23 11:12
希望能给个sample,我们也可以照着做。

情况需要模拟的足够复杂些。
这个倒不必,我主要是想知道算法的实现,像2L那样随机生成的做Sample就行。主要是觉得sas里每个变量的第几个比较难处理

地板
李会超 发表于 2014-12-23 11:34:44
data ex;
do i =1 to 100;
a=round(ranuni(0),1);
b=ranuni(0);
output;
end;
drop i;
run;
data ex2;                                                                                                                             
set ex ;                                                                                                                                
keep b;                                                                                                                                 
run;                                                                                                                                    
  data ex2;                                                                                                                             
set ex2 ;                                                                                                                              
rename b=b2;                                                                                                                           
run;
data ex1;                                                                                                                              
                                                                                                                                       
do i=1 to 100;                                                                                                                          
t=i+1;                                                                                                                                 
set ex point=i;                                                                                                                        
set ex2 point=t;                                                                                                                        
output;                                                                                                                                 
end;                                                                                                                                    
stop;                                                                                                                                   
run;  
类似可以做出B3 B4 B5B6等

7
jackyloda 发表于 2014-12-23 11:48:55
李会超 发表于 2014-12-23 11:34
data ex;
do i =1 to 100;
a=round(ranuni(0),1);
你的意思是把每个B做一个数据集然后再求和是吗?但是你的代码里貌似没有判断A是否等于1这个条件。。

8
李会超 发表于 2014-12-23 11:53:21
jackyloda 发表于 2014-12-23 11:48
你的意思是把每个B做一个数据集然后再求和是吗?但是你的代码里貌似没有判断A是否等于1这个条件。。
我的意思是最后得到一个新的数据集,每个a对应相应位置的b以及b后面五个b值,放在一行显示,然后你在新的数据集基础上再求a=1的行所有b的和

9
jackyloda 发表于 2014-12-23 12:00:45
李会超 发表于 2014-12-23 11:53
我的意思是最后得到一个新的数据集,每个a对应相应位置的b以及b后面五个b值,放在一行显示,然后你在新的 ...
明白了

10
李会超 发表于 2014-12-23 12:03:12
jackyloda 发表于 2014-12-23 12:00
明白了
这个用二楼那哥们的pro iml肯定更简洁,只是很多人不太懂iml模块,我这个思路容易理解,就是代码过长,如果感兴趣可以用R来处理,呵呵

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 12:52