|
我有一段SAS程序,不知道如何利用R语言实现。所以悬赏请教R代码!
# SAS 程序--------------------------------------
首先是创建data One的数据集,包括id, t, dm, s这4列。其中
* id有重复。这里只列出id = 1,2的情况,但是真实数据中还有很多,id=1,2,...,100. * t可以理解为时间,1-7天,或者1-7月等等。 * dm是另一个参数,要根据dm做一些lag。 * s是一些数值。 - data One;
- input id t dm e s f;
- cards;
- 1 1 1 10 15 0
- 1 2 1 20 66 0
- 1 3 1 30 77 0
- 1 4 1 40 80 0
- 1 5 1 40 97 0
- 1 6 1 40 26 0
- 1 7 1 10 15 0
- 2 1 1 90 4 2
- 2 2 1 80 8 1
- 2 3 2 66 3 2
- 2 4 2 44 5 1
- 2 5 2 90 45 2
- 2 6 2 80 85 1
- 2 7 2 66 35 2
- ;
- run;
复制代码
接下来是data Two。从data one里读取数据,然后产生两个临时array。最主要的目的是根据这些来计算x列的值。
- 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[i] =0;
- o[i] = 0;
- end;
- end;
-
- /* 主要问题在这里 */
- dc[t+dm] = dc[t+dm] + s;
- if last.id then do;
- x = 0;
复制代码
# 输出结果-----------------------------
x的计算包括两种情况:
1. 不是某id的最后一行,x的值就根据dm的数值移动s。例如,
id = 1, dm = 1, s的第一行为15,而x的第二行为15。
不过id = 2时,dm的值有两个(1和2),所以移动的情况又会复杂一些。
2. 某id的最后一行,则要[size=14.6667px]根据[size=14.6667px]t和dm的值,计算x。比方说,
[size=14.6667px]id = 1时,最后1行的t = 7,dm = 1。那么t - dm = 6。然后就从s的第6行开始累加。x = 26 + 15 = 41。
[size=14.6667px]id = 2时,最后1行的t = 7,dm = 2。那么t - dm = 5。然后就从s的第6行开始累加。x = 45 + 85 + 35 = 165。
[size=14.6667px](不过这里面还有n的问题,这里n=3,所以最多加3个数。)
|