r - 迭代地找到子集的最小值 - (数百万次)
问题描述
我正在寻找更快、更有效的方式来执行我目前正在做的“操作”(尽管速度很慢)。我有一个包含 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 语句。我也在使用数据表。对此的任何帮助将不胜感激。谢谢!
解决方案
这是一个快速的解决方案:
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"
)
推荐阅读
- authentication - 如何为微服务和用户传递 JWT
- python - azure 上的烧瓶/Web 应用程序随用随付
- c++ - 在不同的编译器上转换为 void**
- java - Java Swing 按钮文本出现不同
- python-3.x - 根据要删除的字符串列表删除字符串末尾的子字符串
- r - 观察循环内的事件
- android - 我怎样才能在android studio(Camera2)中获得相机分辨率
- django - 如何在表单验证后将 Django 表单提交重定向到新选项卡?
- java - 我在进行一些基本的 JSON 解析时遇到问题
- android - 项目展开时如何将所有项目绑定到回收站视图的底部?