4501 12

[问答] 如何用SAS对变化的变量求和? [推广有奖]

  • 0关注
  • 0粉丝

大专生

55%

还不是VIP/贵宾

-

威望
0
论坛币
136 个
通用积分
0.8500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1742 点
帖子
5
精华
0
在线时间
110 小时
注册时间
2016-9-5
最后登录
2023-11-20

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; / ...
关键词:如何用 Start STAR End ART 如何
沙发
foocares 发表于 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


你看看对不对得上。

使用道具

start 和end都是变化的,怎样求每行从start 到end的和

使用道具

板凳
foocares 发表于 2017-4-15 22:17:43 |只看作者 |坛友微信交流群
用array来实现。开头定义array myarray(*) var1-var8
读每行的数据进来。
do i = start to end
total+array(i);
end;

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

使用道具

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;

使用道具

7
离居盈寒暑7 发表于 2017-4-18 12:57:41 |只看作者 |坛友微信交流群
求指点,数据已经贴上!就是想在每行的末尾放上从start到end对应的年份的GDP和

hw5.xls

560.5 KB

这是处理了一部分的数据

使用道具

8
离居盈寒暑7 发表于 2017-4-18 12:59:42 |只看作者 |坛友微信交流群
孤单的我们 发表于 2017-4-18 12:54
do i=1 to 29;
我想在每行选择start到end求和,不需要全部求和~~star和end是变化的

使用道具

9
foocares 发表于 2017-4-18 13:04:47 |只看作者 |坛友微信交流群
能贴下log吗?你的start和end在不在hw5的set里,是固定能读到的两列吗?
不过思路反正就是这样了:
假定set有如下结构:
obs  start  end  v1    v2   v3   v4   v5
1       2     3     5.6  6.6 4.5  6.7  8.9
2       3     5     xx    xx   xx  xx    xx
.....
那么在data步的每一个循环里,我既能读到每一行的start和end值,也知道array(i)都对应着后头的Vi,
求和的范围是由每次读到的start和end来决定,对应着求和数组元素的下标,而每行求和的值记在了total里,输出到目标文件。
这么实现并没理解错吧?

使用道具

10
foocares 发表于 2017-4-18 13:30:44 |只看作者 |坛友微信交流群
离居盈寒暑7 发表于 2017-4-18 12:57
求指点,数据已经贴上!就是想在每行的末尾放上从start到end对应的年份的GDP和
根据你这个数据格式,我的理解F和G列对应你说的start和end,对么。
不知道你程序具体怎么实现的,总不会直接读了年份就去套后面的下标吧。。。
这里肯定要做一个数据重组,先换算把年份跟后头的数据index要能一一对应起来。比如:
按我理解H列开始是最早的年份数据,那么它对应的哪一年?start跟它对应年份的关系应该是
该年 - H列所在年份 +1
比如H列是从95年开始,那么1998对应着start = 4, end在2000年对应的6. 与之相对应的是你excel里的K到 M求和
  98  00    95  96 97 98 99 00  
start end   H    I   J   K    L  M
  4     6    a(1) ........a(4)...a(6)

希望你的年份计数是固定连续的,也就是说,H列统统是起始年数据,I列是后续第二年数据。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-6 03:50