首页 > 解决方案 > 迭代地找到子集的最小值 - (数百万次)

问题描述

我正在寻找更快、更有效的方式来执行我目前正在做的“操作”(尽管速度很慢)。我有一个包含 500 万个观测值和 10 个特征(变量)的数据表。此操作感兴趣的变量是三个:Price、date_initial、date_final。

这是我需要做的:对于每个观察,我需要查看表格并确定该观察是否具有所有其他具有相同 date_initial 和相同 date_final 的观察的最低价格。因此,基本上对于每一行,我需要查看日期中的适当子集并确定最低价格并检查当前观察值是否 == 到该最低价格。

这是一个示例:(结果标志是我要生成的)在此处输入图像描述

Price   date_initial    date_final   Result_Flag
45      2018-01-01      2018-01-10   No
40      2018-01-01      2018-01-07   Yes
48      2018-01-01      2018-01-10   No
49      2018-01-01      2018-01-10   No
42      2018-01-01      2018-01-10   Yes
69      2018-01-01      2018-01-07   No

如您所见,第二个观察结果是“是”,因为它在 date_initial == 2018-01-01 和 date_final == 2018-01-07 的所有观察值中价格最低。同样,我正在寻找一种有效且快速(更好)的方法来做到这一点。我目前的方法有效,但速度很慢。我正在使用 apply to 和 ifelse 语句。我也在使用数据表。对此的任何帮助将不胜感激。谢谢!

标签: rperformancesubsetmin

解决方案


这是一个快速的解决方案:

dt[, res := ifelse(Price == min(Price), 'yes', 'no'),  by = .(date_initial, date_final)]
dt
#    Price date_initial date_final Result_Flag res
# 1:    45   2018-01-01 2018-01-10          No  no
# 2:    40   2018-01-01 2018-01-07         Yes yes
# 3:    48   2018-01-01 2018-01-10          No  no
# 4:    49   2018-01-01 2018-01-10          No  no
# 5:    42   2018-01-01 2018-01-10         Yes yes
# 6:    69   2018-01-01 2018-01-07          No  no

使用这些数据:

dt = fread("Price   date_initial    date_final   Result_Flag
45      2018-01-01      2018-01-10   No
40      2018-01-01      2018-01-07   Yes
48      2018-01-01      2018-01-10   No
49      2018-01-01      2018-01-10   No
42      2018-01-01      2018-01-10   Yes
69      2018-01-01      2018-01-07   No"
)

推荐阅读