全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
741 4
2022-03-30
悬赏 100 个论坛币 未解决
我有一段SAS程序,想用R语言实现相同的功能,但没能搞定。
主要问题是这句:x = x + dc[t+i];        
看那位大神有空帮忙搞定。
100论坛币,略表寸心!
/********************************/具体情况我来解释一下:

有一个表格,包括id, t, dm, s这4列。其中

* id有重复。这里只列出id = 1,2的情况,但是真实数据中还有很多,id=1,2,...,100.

* t可以理解为时间,1-7天,或者1-7月等等。

* dm是另一个参数。

* s是一些已知的数值。

根据这些来计算x的值。

inputdf.png


#--------------------------------------------

计算过程分为两种情况:

首先,找到每一个id的最后一行。如果是最后一行,那么在do循环里计算x。这里应该是累加。比方说,

7行, id = 1, x = 138 = 97+26+15。

14行,id = 2, x = 135 = 0+5+45+85。

outdf.png


其次,如果不是id的最后一行,情况似乎简单一些。比方说,

4行x = 15,这就是第1行s的值。

6行x = 80,这就是第4行s的值。

但是第5行 x = 143 = 66+77。也就是第2行和第3行s值的和。这个就很奇妙了,不知道SAS为什么这么做。


/****下面是SAS程序*****/

data One;
        input  id t dm e s f;
        cards;
1 1  3  10 15 0
1 3  2  30 77 0
1 4  2  40 80 0
1 5  2  40 97 0
1 6  2  40 26 0
1 7  2  10 15 0
2 1  3  90 4  2
2 2  3  80 8  1
2 3  3  66 13 2
2 4  4  44 5  1
2 5  4  90 45 2
2 6  4  80 85 1
2 7  4  66 35 2
;
run;

data Two;
        set One;
        by id;

        array o{0:150}  _temporary_;
        array dc{0:150} _temporary_;
        
        if first.id then do;
                do i = 0 to 10;
                        dc =0;
                        o = 0;
                end;
        end;
        
        /* 主要问题在这里 */
        dc[t+dm] = dc[t+dm] + s;
        if last.id then do;
                x    = 0;
                n    = 3;               
                do i = 0 to n;
                        x = x + dc[t+i];
                end;
        end;
        else do;
                x = dc[t];
        end;
run;



二维码

扫码加我 拉你入群

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

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

全部回复
2022-3-30 13:34:25
建议你给出一个初始数据集,再给出一个要生成的数据集。这样方便大家理解你的问题
二维码

扫码加我 拉你入群

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

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

2022-3-30 21:57:54
乐天天12300 发表于 2022-3-30 13:34
建议你给出一个初始数据集,再给出一个要生成的数据集。这样方便大家理解你的问题
感谢阅读,感谢提出的建议。
我已经对问题做出了进一步的解释。
二维码

扫码加我 拉你入群

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

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

2022-3-31 14:33:00
wx2123 发表于 2022-3-30 21:57
感谢阅读,感谢提出的建议。
我已经对问题做出了进一步的解释。
有些逻辑我并不能理解到位:
1.id是最后一行的
第7行, id = 1, x = 138 = 97+26+15。
第14行,id = 2, x = 135 = 0+5+45+85
为什么第14行的时候计算累计有个0,加法最后一个数值85是第13行的s值。而第7行的加法最后一个数值15是第7行的s值,这里面的逻辑并不清晰。
2.id不是最后一行
你说第5行的x值143不是你想要的,那么第5行值应该是什么?
二维码

扫码加我 拉你入群

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

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

2022-4-1 00:04:52
乐天天12300 发表于 2022-3-31 14:33
有些逻辑我并不能理解到位:
1.id是最后一行的
第7行, id = 1, x = 138 = 97+26+15。
感谢回复。这个问题我已经自己搞定了。不过我们还可以继续交流。
关于你不理解的逻辑,其实我也不太理解。
有些逻辑我并不能理解到位:
1.id是最后一行的
第7行, id = 1, x = 138 = 97+26+15。
第14行,id = 2, x = 135 = 0+5+45+85
为什么第14行的时候计算累计有个0,加法最后一个数值85是第13行的s值。而第7行的加法最后一个数值15是第7行的s值,这里面的逻辑并不清晰。


这里有个0是我看SAS的结果。我加了几个put语句,你可以看后面的SAS日志。

2.id不是最后一行
你说第5行的x值143不是你想要的,那么第5行值应该是什么?


这个143也是SAS算出来的,至于为什么是66+77。我也不完全理解,但是SAS就是这么算的。

你先看看下面的SAS日志。咱们再继续交流。

/******* SAS 日志 *************////
1          OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
68         
69         
70         data One;
71         input  id t dm e s f;
72         cards;

NOTE: 数据集 WORK.ONE 有 14 个观测和 6 个变量。

87         ;
88         run;
89         
90         data Two;
91         set One;
92         by id;
93         
94         array o{0:150}  _temporary_;
95         array dc{0:150} _temporary_;
96         
97         if first.id then do;
98         do i = 0 to 10;
99         dc =0;
100        o = 0;
101        end;
102        end;
103        
104        /* 主要问题在这里 */
105        dc[t+dm] = dc[t+dm] + s;
106        if last.id then do;
107        x    = 0;
108        n    = 3;
109        do i = 0 to n;
110        x = x + dc[t+i];
111        d3 = dc[t+i];
112        put '------------------';
113        put 'i t d3 x';
114        put  i t d3 x;
115        end;
116        end;
117        else do;
118        x = dc[t];
119        put '********************';
120        put x;
121        end;
122        run;

********************
0
********************
0
********************
0
********************
15
********************
143
********************
80
------------------
i t d3 x
0 7 97 97
------------------
i t d3 x
1 7 26 123
------------------
i t d3 x
2 7 15 138
------------------
i t d3 x
3 7 0 138
********************
0
********************
0
********************
0
********************
4
********************
8
********************
13
------------------
i t d3 x
0 7 0 0
------------------
i t d3 x
1 7 5 5
------------------
i t d3 x
2 7 45 50
------------------
i t d3 x
3 7 85 135
NOTE: 缺失值的生成是对缺失值执行操作的结果。
       指定每个位置的方式: (次数)(行:列)。
       1 次,位于 105:22   
NOTE: 从数据集 WORK.ONE. 读取了 14 个观测
NOTE: 数据集 WORK.TWO 有 14 个观测和 10 个变量。


二维码

扫码加我 拉你入群

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

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

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

分享

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