如何在大数据上快速从data.table子集中多行

伦尼

我正在与R-Studio合作,并希望从data.table中获取多行。

假设我有一个data.table,其中包含以下数据:

Date                           Column 1
"01.02.2016 10:00:00  CEST"    10        
"01.02.2016 10:01:00  CEST"    12
"01.02.2016 10:02:00  CEST"    13
"01.02.2016 10:03:00  CEST"    11
"01.02.2016 10:04:00  CEST"    17

并且我想要从“ 01.02.2016 10:00:30”“ 01.02.2016 10:02:30”的值是这样的:

    Date                       Column 1       
"01.02.2016 10:01:00  CEST"    12
"01.02.2016 10:02:00  CEST"    13

目前,我通过执行以下操作来实现此目的:

x <- data.table[Date >= "01.02.2016 10:00:30  CEST" & Date <= "01.02.2016 10:02:30  CEST"]

但这对我来说太慢了,因为在具有60万行的data.table上,它大约需要0.4秒。

相反,这要快得多:

setkey(data.table, Date)
x <- prozessdaten.data.table[J(c("01.02.2016 10:01:00  CEST", "01.02.2016 10:02:00  CEST"))]

我的问题是否有可能在指定的时间范围内而不是确切的值使用二进制搜索函数J()?

大卫·阿伦堡(David Arenburg)

data.table v1.9.7 +已实现等额联接,并添加了一个inrange使用此新功能并可以实现您想要的功能的新功能

## Loading data
library(data.table) #v 1.9.7+
DT <- data.table(date = c('01.02.2016 10:00:00','01.02.2016 10:01:00',
                          '01.02.2016 10:02:00','01.02.2016 10:03:00',
                          '01.02.2016 10:04:00'),
                 column1 = c(10, 12, 13, 11, 17))

## Converting to POSIXct class
DT[, date := as.POSIXct(date, format = "%d.%m.%Y %H:%M:%S")]

## Validating that forder/bmerge kicks in 
options(datatable.verbose = TRUE)
DT[date %inrange% as.POSIXct(c("2016-02-01 10:00:30", "2016-02-01 10:02:30"))]
# forderv(query) took ... 0 secs
# Starting bmerge ...done in 0 secs <~~~~~~~~ (Thanks to @Arun for fixing the bug)
# Generating final logical vector ... done in 0 secs
#                   date column1
# 1: 2016-02-01 10:01:00      12
# 2: 2016-02-01 10:02:00      13

不过,您应该知道,由于实现了data.table 1.9.4次要键,这意味着对于矢量扫描的某些变化,在第一次运行后会添加一个键,从现在开始,甚至还会使用==操作这似乎在上不起作用,但是您可以在数字列上观察到此行为%in%bmergePOSIXctcolumn1

## Running for first time
options(datatable.verbose = TRUE)
DT[column1 == 10]
# Creating new index 'column1'
# forder took 0 sec <~~~ forder kicks in, hence first time is a bit slow
# Starting bmerge ...done in 0 secs
#                   date column1
# 1: 2016-02-01 10:00:00      10

## Running for second time and on
DT[column1 == 10]
# Using existing index 'column1'
# Starting bmerge ...done in 0 secs <~~ bmerge kicks in from now on
#                   date column1
# 1: 2016-02-01 10:00:00      10

如前所述通过@Jan,这个计划对于非球菌中实现联接也从V2.0.0开始


编辑(26/8/2016):

正如@Arun指出的那样,尽管inrange使用二进制连接,但它需要首先对整个向量进行排序,以检查x中的每个是否在上,下提供的任何间隔之间在您的情况下,这有点麻烦,因为您仅将两个值进行比较,因此最近用Cbetween函数重写的代码将更适合您

set.seed(123)
DT <- data.table(x = sample(5e8))

system.time(res1 <- DT[x > 1e3L & x < 1e5L])
#  user  system elapsed 
# 10.23    1.22   11.45 

system.time(res2 <- DT[x %inrange% c(1e3L, 1e5L)])
# forderv(query) took ... 29.09 secs
# Starting bmerge ...done in 0 secs
# Generating final logical vector ... done in 0.43 secs
#  user  system elapsed 
# 29.28    0.70   30.06 

system.time(res3 <- DT[x %between% c(1e3L, 1e5L)])
# user  system elapsed 
# 2.01    2.60    0.84

因此,您可以看到,尽管bmerge几乎是即时的,但排序需要花费大量时间。Whilebetween是最快的,因为它不需要x两次转换为逻辑向量。哎呀,between太快了,elapsed小到了user+system

不过,如果您的数据已经排序,那么inrange可以很好地赶上

setorder(DT, x)
system.time(res1 <- DT[x > 1e3L & x < 1e5L])
#  user  system elapsed 
# 10.41    1.02   11.45 

system.time(res2 <- DT[x %inrange% c(1e3L, 1e5L)])
# forderv(query) took ... 2.17 secs
# Starting bmerge ...done in 0 secs
# Generating final logical vector ... done in 0.44 secs
#  user  system elapsed 
# 2.47    0.71    3.20 

system.time(res3 <- DT[x %between% c(1e3L, 1e5L)])
#  user  system elapsed 
# 2.30    2.62    0.88 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在大数据上快速从data.table子集中多行

来自分类Dev

在data.table子集中的i中使用变量

来自分类Dev

合并数据集中的多行

来自分类Dev

从数据子集中选择

来自分类Dev

使用data.table的.SDcols参数计算列子集中的逻辑值

来自分类Dev

根据条件子集中的行号就地编辑 data.table 列

来自分类Dev

如何计算从数据子集中的列的均值

来自分类Dev

在R中,如何在子集中对数据帧进行子集化?

来自分类Dev

在Spotfire中的数据子集中排名

来自分类Dev

设置熊猫数据框子集中的列表

来自分类Dev

如何访问 GAMS 子集中的成员?

来自分类Dev

如何在保持数据类型的同时将多个timedate数据放入数据帧的子集中?

来自分类Dev

如何从数据集中任意提取特定的图像子集?

来自分类Dev

如何删除数据帧子集中的行

来自分类Dev

如何在子集中的Nhibernate中执行QueryOver

来自分类Dev

如何在子集中创建启动/停止条件?

来自分类Dev

如何使用MySQL和Java在JFreechart数据集中返回多行

来自分类Dev

使用数据子集时如何在data.table中创建新列并计算中位数

来自分类Dev

R循环到大数据帧子集并提供多行输出

来自分类Dev

列出数据框子集中的所有变量(及其比例)

来自分类Dev

数据框子集中的字符串索引-Pandas

来自分类Dev

数据帧子集中的第一条记录

来自分类Dev

根据数据集中的位置在ggplot中子集特定日期

来自分类Dev

熊猫-根据子集中的数据类型选择列

来自分类Dev

子集中数据框中的特定行,但保留观察结果

来自分类Dev

使用dplyr独立地获取数据集中的子集变量

来自分类Dev

在数据框的每个子集中应用功能

来自分类Dev

如何从df子集中多列,包括grep匹配

来自分类Dev

Alloy约束如何将集合放入其子集中?

Related 相关文章

  1. 1

    如何在大数据上快速从data.table子集中多行

  2. 2

    在data.table子集中的i中使用变量

  3. 3

    合并数据集中的多行

  4. 4

    从数据子集中选择

  5. 5

    使用data.table的.SDcols参数计算列子集中的逻辑值

  6. 6

    根据条件子集中的行号就地编辑 data.table 列

  7. 7

    如何计算从数据子集中的列的均值

  8. 8

    在R中,如何在子集中对数据帧进行子集化?

  9. 9

    在Spotfire中的数据子集中排名

  10. 10

    设置熊猫数据框子集中的列表

  11. 11

    如何访问 GAMS 子集中的成员?

  12. 12

    如何在保持数据类型的同时将多个timedate数据放入数据帧的子集中?

  13. 13

    如何从数据集中任意提取特定的图像子集?

  14. 14

    如何删除数据帧子集中的行

  15. 15

    如何在子集中的Nhibernate中执行QueryOver

  16. 16

    如何在子集中创建启动/停止条件?

  17. 17

    如何使用MySQL和Java在JFreechart数据集中返回多行

  18. 18

    使用数据子集时如何在data.table中创建新列并计算中位数

  19. 19

    R循环到大数据帧子集并提供多行输出

  20. 20

    列出数据框子集中的所有变量(及其比例)

  21. 21

    数据框子集中的字符串索引-Pandas

  22. 22

    数据帧子集中的第一条记录

  23. 23

    根据数据集中的位置在ggplot中子集特定日期

  24. 24

    熊猫-根据子集中的数据类型选择列

  25. 25

    子集中数据框中的特定行,但保留观察结果

  26. 26

    使用dplyr独立地获取数据集中的子集变量

  27. 27

    在数据框的每个子集中应用功能

  28. 28

    如何从df子集中多列,包括grep匹配

  29. 29

    Alloy约束如何将集合放入其子集中?

热门标签

归档