全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4862 12
2017-04-15
悬赏 5 个论坛币 已解决
大神们,求教!比如说有一个数据集,第一行是变量名,第二行开始是变量值。
标的        start   end          1       2      3     4      5      6      7     8
A              2      5           0.2     0.5   0.3   0.2   0.4    0.4    0.2   0.7
…………
我想求每行从start 到end 的和,放在每行末尾,应该怎么写代码?
真心求教!!!刚学SAS不大会……

最佳答案

foocares 查看完整内容

如上文所言,整理原始数据很重要,比如看了你的数据后我知道你开始计数的年份是从78年开始,到06年结束。 那么换成数组时start 和end可就不能在这个范围之外,而你的原始数据里有start计为77年的,end甚至有计为9999年的,这很容易就让array下标越界报错,因此,在原始代码里我加了两行修正用于保护: PROC IMPORT DATAFILE = 'D:\SAS9\My SAS Files\9.0\Little SAS Book Codes\hw5.xls' DBMS=excel OUT = hw5test; RUN; / ...
二维码

扫码加我 拉你入群

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

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

全部回复
2017-4-15 19:18:02
如上文所言,整理原始数据很重要,比如看了你的数据后我知道你开始计数的年份是从78年开始,到06年结束。
那么换成数组时start 和end可就不能在这个范围之外,而你的原始数据里有start计为77年的,end甚至有计为9999年的,这很容易就让array下标越界报错,因此,在原始代码里我加了两行修正用于保护:

PROC IMPORT DATAFILE = 'D:\SAS9\My SAS Files\9.0\Little SAS Book Codes\hw5.xls' DBMS=excel OUT = hw5test;
RUN;

/*先选前十个记录试试*/
options obs = 10;
data test;
        set hw5test(drop = eventid name location newdate2str location1);
        array myar(*) F8 - F36;
*assume F8 data always starts in 1978;
        startyear = 1978;
        endyear = 2006;
        /* 78年前的start标记没数据对应,那我求和反正就从有数据的元年78年开始算了*/
        if start < startyear then start = startyear;
        start_idx = start - startyear + 1;
       /*同理06年后的end也无数据可对应,那我求和也就到最后一列06年打止了*/
        if end > endyear then end = endyear;
        end_idx = end - startyear + 1;
        do i = start_idx to end_idx;
                total + myar(i);
        end;
    put total=;

run;

SAS运算结果前十行结果如下:
total=10.29
total=46.22
total=106.4
total=206.01
total=261.38
total=318.17
total=339.46
total=350.02
total=386.76
total=441.83


你看看对不对得上。
二维码

扫码加我 拉你入群

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

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

2017-4-15 19:20:17
start 和end都是变化的,怎样求每行从start 到end的和
二维码

扫码加我 拉你入群

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

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

2017-4-15 22:17:43
用array来实现。开头定义array myarray(*) var1-var8
读每行的数据进来。
do i = start to end
total+array(i);
end;

total是你每行求和的结果,会写到最后的输出数据里。
二维码

扫码加我 拉你入群

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

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

2017-4-18 12:36:11
foocares 发表于 2017-4-15 22:17
用array来实现。开头定义array myarray(*) var1-var8
读每行的数据进来。
do i = start to end
哇,谢大神~
data hw5_1;
set hw5;
array myarray(29) 1978y-2006y;
do i = start to end;
total+array(i);
end;
run;
试了一下,不行哎,可以再请教下吗?
二维码

扫码加我 拉你入群

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

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

2017-4-18 12:54:59
do i=1 to 29;
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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