全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1584 3
2013-09-10
向各位大侠求救:
其实我只是想用循环来做筛选A矩阵中每一列大于30的元素的和。

我这样写的时候系统提示错误说是没有给b矩阵赋值,不知道如何修改。
proc iml;
a={1 2 50 60,
        2 50 60 10};
n=0;
do while(n<10);
n=n+1;
k=ncol(a);
do i=1 to k;
b=loc(a[,i]>30);
c=sum(a[b,i]);
print a b c ;
end;
end;
quit;
QQ图片20130910225841.jpg

附件列表
QQ图片20130910224213.jpg

原图尺寸 16.93 KB

出错截图

出错截图

二维码

扫码加我 拉你入群

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

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

全部回复
2013-9-11 11:49:17
我自己解决了:
由于在a矩阵的第一列所有的元素都是小于30的,这时候loc(a[,i]>30)无法返回数值。所以就会说b矩阵没有被赋值了
然后我用那个any函数来判断后再做计算便可以解决问题。
proc iml;
a={1 2 50 60,
   2 50 60 10};
n=0;
do while(n<10);
n=n+1;
k=ncol(a);
do i=1 to k;
b=any(a[,i]>30);
if b=1 then do;
d=loc(a[,i]>30);
c=sum(a[d,i]);
end;
else do;
d=loc(a[,i]<30);
c=sum(a[d,i]);
end;
print a b c ;
end;
end;
quit;

二维码

扫码加我 拉你入群

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

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

2013-9-11 12:27:29
学习了

另外你这个问题如果不用IML
用SQL的话会很简单
因为你是求列的嘛

如果求行的话,用array也可以
二维码

扫码加我 拉你入群

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

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

2013-9-11 13:24:54
playmore 发表于 2013-9-11 12:27
学习了

另外你这个问题如果不用IML
恩是的,用SQL的话会很简单。其实这个只是一个程序的开头,后面还要做其他的矩阵计算。
一开头就被卡着的感觉真不爽。主要还是IML用得少,对于它的函数运行结果不是很熟悉导致的。
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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