Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用data.table和for循环提高代码执行时间效率_R_Performance_For Loop_Data.table - Fatal编程技术网

使用data.table和for循环提高代码执行时间效率

使用data.table和for循环提高代码执行时间效率,r,performance,for-loop,data.table,R,Performance,For Loop,Data.table,问题:如何使下面代码中的for循环更高效地运行?对于这个玩具示例,它在合理的时间内工作。但是,unique_id将是大约8000个条目的向量,for循环会大大降低计算速度。有什么想法吗?非常感谢 目的: 根据for循环中的计算逻辑,将每天的IID分为hop和top 初始数据: IID ENTRY FINISH TARGET max_finish_target_date 1: 1 2020-02-11 2020-02-19 2020-02-15

问题:如何使下面代码中的for循环更高效地运行?对于这个玩具示例,它在合理的时间内工作。但是,unique_id将是大约8000个条目的向量,for循环会大大降低计算速度。有什么想法吗?非常感谢

目的: 根据for循环中的计算逻辑,将每天的IID分为hop和top

初始数据:

   IID      ENTRY     FINISH     TARGET max_finish_target_date
1:      1 2020-02-11 2020-02-19 2020-02-15             2020-02-19
2:      2 2020-02-13 2020-02-17 2020-02-19             2020-02-19
最终目标数据:

 IID      Dates    ind_frist
 1:      1 2020-02-10             
 2:      1 2020-02-11 hop
 3:      1 2020-02-12 hop
 4:      1 2020-02-13 hop
 5:      1 2020-02-14 hop
 6:      1 2020-02-15 hop
 7:      1 2020-02-16 top
 8:      1 2020-02-17 top
 9:      1 2020-02-18 top
10:      1 2020-02-19 top
11:      2 2020-02-10             
12:      2 2020-02-11             
13:      2 2020-02-12             
14:      2 2020-02-13 hop
15:      2 2020-02-14 hop
16:      2 2020-02-15 hop
17:      2 2020-02-16 hop
18:      2 2020-02-17 hop
19:      2 2020-02-18             
20:      2 2020-02-19             
21:      3 2020-02-10             
22:      3 2020-02-11             
23:      3 2020-02-12             
24:      3 2020-02-13             
25:      3 2020-02-14             
26:      3 2020-02-15 hop
27:      3 2020-02-16 hop
28:      3 2020-02-17 top
29:      3 2020-02-18 top
30:      3 2020-02-19 top
代码


使用-join的可能备选方案:

这与for循环的输出相同


一些解释:部分1L+Dates>TARGET&Dates使用-join的可能替代方案:

这与for循环的输出相同


一些解释:循环的部分1L+Dates>TARGET&Dates不会产生所显示的输出。以下非等联接产生该输出,但可以根据其他规则(例如,来自for循环的规则)轻松进行调整:

这些连接应该非常快

结果:

#    IID      Dates ind_frist
# 1:   1 2020-02-10      <NA>
# 2:   1 2020-02-11       hop
# 3:   1 2020-02-12       hop
# 4:   1 2020-02-13       hop
# 5:   1 2020-02-14       hop
# 6:   1 2020-02-15       hop
# 7:   1 2020-02-16       top
# 8:   1 2020-02-17       top
# 9:   1 2020-02-18       top
#10:   1 2020-02-19       top
#11:   2 2020-02-10      <NA>
#12:   2 2020-02-11      <NA>
#13:   2 2020-02-12      <NA>
#14:   2 2020-02-13       hop
#15:   2 2020-02-14       hop
#16:   2 2020-02-15       hop
#17:   2 2020-02-16       hop
#18:   2 2020-02-17       hop
#19:   2 2020-02-18      <NA>
#20:   2 2020-02-19      <NA>
#21:   3 2020-02-10      <NA>
#22:   3 2020-02-11      <NA>
#23:   3 2020-02-12      <NA>
#24:   3 2020-02-13      <NA>
#25:   3 2020-02-14      <NA>
#26:   3 2020-02-15       hop
#27:   3 2020-02-16       hop
#28:   3 2020-02-17       top
#29:   3 2020-02-18       top
#30:   3 2020-02-19       top
#    IID      Dates ind_frist

循环不会产生所显示的输出。以下非等联接产生该输出,但可以根据其他规则(例如,来自for循环的规则)轻松进行调整:

这些连接应该非常快

结果:

#    IID      Dates ind_frist
# 1:   1 2020-02-10      <NA>
# 2:   1 2020-02-11       hop
# 3:   1 2020-02-12       hop
# 4:   1 2020-02-13       hop
# 5:   1 2020-02-14       hop
# 6:   1 2020-02-15       hop
# 7:   1 2020-02-16       top
# 8:   1 2020-02-17       top
# 9:   1 2020-02-18       top
#10:   1 2020-02-19       top
#11:   2 2020-02-10      <NA>
#12:   2 2020-02-11      <NA>
#13:   2 2020-02-12      <NA>
#14:   2 2020-02-13       hop
#15:   2 2020-02-14       hop
#16:   2 2020-02-15       hop
#17:   2 2020-02-16       hop
#18:   2 2020-02-17       hop
#19:   2 2020-02-18      <NA>
#20:   2 2020-02-19      <NA>
#21:   3 2020-02-10      <NA>
#22:   3 2020-02-11      <NA>
#23:   3 2020-02-12      <NA>
#24:   3 2020-02-13      <NA>
#25:   3 2020-02-14      <NA>
#26:   3 2020-02-15       hop
#27:   3 2020-02-16       hop
#28:   3 2020-02-17       top
#29:   3 2020-02-18       top
#30:   3 2020-02-19       top
#    IID      Dates ind_frist

您需要为data.table设置唯一键。您还需要使用内置的for i j操作,它在内存中非常轻,并且不复制数据。查看from:to setDT、row、column、new value中i的集合族来源:问题中显示的目标数据与for-loop的输出不同。您需要为data.table设置唯一键。您还需要使用内置的for i j操作,它在内存中非常轻,并且不复制数据。查看from:to setDT、row、column、new value source中i的集合族:问题中显示的目标数据与for-loop的输出不同。您好,谢谢您的帮助。你能详细解释一下ind_first的语法吗?我还没有见过这种语法before@rkraft第1L+部分日期>目标和日期您好,谢谢您的帮助。你能详细解释一下ind_first的语法吗?我还没有见过这种语法before@rkraft部分1L+日期>目标和日期
    IID      Dates ind_frist
 1:   1 2020-02-10          
 2:   1 2020-02-11       top
 3:   1 2020-02-12       top
 4:   1 2020-02-13       top
 5:   1 2020-02-14       top
 6:   1 2020-02-15       top
 7:   1 2020-02-16       hop
 8:   1 2020-02-17       hop
 9:   1 2020-02-18       hop
10:   1 2020-02-19       hop
11:   2 2020-02-10          
12:   2 2020-02-11          
13:   2 2020-02-12          
14:   2 2020-02-13       top
15:   2 2020-02-14       top
16:   2 2020-02-15       top
17:   2 2020-02-16       top
18:   2 2020-02-17       top
19:   2 2020-02-18       top
20:   2 2020-02-19       top
21:   3 2020-02-10          
22:   3 2020-02-11          
23:   3 2020-02-12          
24:   3 2020-02-13          
25:   3 2020-02-14          
26:   3 2020-02-15       top
27:   3 2020-02-16       top
28:   3 2020-02-17       hop
29:   3 2020-02-18       hop
30:   3 2020-02-19       hop
final_dt <- CJ(IID = initial_dt[["IID"]], Dates = dts)
final_dt[initial_dt, ind_frist := "hop", on = .(IID, Dates >= ENTRY, Dates <= FINISH)]
final_dt[initial_dt, ind_frist := "top", on = .(IID, Dates > TARGET, Dates <= FINISH)]
#    IID      Dates ind_frist
# 1:   1 2020-02-10      <NA>
# 2:   1 2020-02-11       hop
# 3:   1 2020-02-12       hop
# 4:   1 2020-02-13       hop
# 5:   1 2020-02-14       hop
# 6:   1 2020-02-15       hop
# 7:   1 2020-02-16       top
# 8:   1 2020-02-17       top
# 9:   1 2020-02-18       top
#10:   1 2020-02-19       top
#11:   2 2020-02-10      <NA>
#12:   2 2020-02-11      <NA>
#13:   2 2020-02-12      <NA>
#14:   2 2020-02-13       hop
#15:   2 2020-02-14       hop
#16:   2 2020-02-15       hop
#17:   2 2020-02-16       hop
#18:   2 2020-02-17       hop
#19:   2 2020-02-18      <NA>
#20:   2 2020-02-19      <NA>
#21:   3 2020-02-10      <NA>
#22:   3 2020-02-11      <NA>
#23:   3 2020-02-12      <NA>
#24:   3 2020-02-13      <NA>
#25:   3 2020-02-14      <NA>
#26:   3 2020-02-15       hop
#27:   3 2020-02-16       hop
#28:   3 2020-02-17       top
#29:   3 2020-02-18       top
#30:   3 2020-02-19       top
#    IID      Dates ind_frist