我有一段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的值。
#--------------------------------------------
计算过程分为两种情况:
首先,找到每一个id的最后一行。如果是最后一行,那么在do循环里计算x。这里应该是累加。比方说,
第7行, id = 1, x = 138 = 97+26+15。
第14行,id = 2, x = 135 = 0+5+45+85。
其次,如果不是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;