楼主: wx2123
4389 2

[问答] 请教SAS中的数组和循环如何在R语言中实现 [推广有奖]

  • 1关注
  • 2粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
5595 个
通用积分
220.6077
学术水平
1 点
热心指数
5 点
信用等级
0 点
经验
3111 点
帖子
93
精华
0
在线时间
193 小时
注册时间
2015-9-10
最后登录
2025-11-9

楼主
wx2123 在职认证  发表于 2022-3-2 11:56:40 |AI写论文
100论坛币
我有一段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是一些数值。

  1. data One;
  2.         input  id t dm e s f;
  3.         cards;
  4. 1 1  1  10 15 0                                                                                                               
  5. 1 2  1  20 66 0                                                                                                         
  6. 1 3  1  30 77 0                                                                                                            
  7. 1 4  1  40 80 0
  8. 1 5  1  40 97 0   
  9. 1 6  1  40 26 0
  10. 1 7  1  10 15 0                                                                                          
  11. 2 1  1  90 4  2
  12. 2 2  1  80 8  1
  13. 2 3  2  66 3  2
  14. 2 4  2  44 5  1
  15. 2 5  2  90 45  2
  16. 2 6  2  80 85  1
  17. 2 7  2  66 35  2                                                                                                            
  18. ;
  19. run;
复制代码

接下来是data Two。从data one里读取数据,然后产生两个临时array。最主要的目的是根据这些来计算x列的值。
  1. data Two;
  2.     set One;
  3.     by id;

  4.     array o{0:150}  _temporary_;
  5.     array dc{0:150} _temporary_;
  6.         
  7.     if first.id then do;
  8.         do i = 0 to 10;
  9.             dc[i] =0;
  10.             o[i] = 0;
  11.        end;
  12.     end;
  13.         
  14.     /* 主要问题在这里 */
  15.     dc[t+dm] = dc[t+dm] + s;
  16.     if last.id then do;
  17.         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个数。)

output.png

关键词:R语言 TEMPORARY array Input cards

沙发
abelus 发表于 2022-3-2 14:31:54
在R中,用不同于SAS中您这种思路,处理起来会更快一些。

不如直接描述清楚处理的需要,R中代码会比较简单。


藤椅
wx2123 在职认证  发表于 2022-3-2 23:13:01
abelus 发表于 2022-3-2 14:31
在R中,用不同于SAS中您这种思路,处理起来会更快一些。

不如直接描述清楚处理的需要,R中代码会比较简 ...
我修改了原文,加入了输出结果和计算过程的描述。你看看是不是清楚一些了。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-20 16:46