0

我有一个数据框 df,其中包含 2018 年每小时通过伦敦地铁站的流量:

        Year    Month Day  Hour    Station.ID    Traffic
1       2018    1     1    0       A             1000
2       2018    1     1    0       B             1300
3       2018    1     1    0       C             956
4       2018    1     1    0       D             721
...

它的长度超过 7,000,000 行。我想要一种有效的方法来查找特定日期和时间的流量。例如,如果我想知道 2018 年 4 月 5 日上午 10 点在“X”站的流量,我目前会执行:

df[df$Year==2018 & df$Month==5 & df$Day==4 & df$Hour==10 & df$Station.ID=='X',]$Traffic

但是这种方法将不必要地查看整个数据框。我的想法是将数据组织成这样的层次结构:

library(data.tree)
df$pathString <- paste("MyTree", 
                        df$Year, 
                        df$Month,
                        df$Day,
                        df$Hour,
                        df$Station.ID,
                        sep = "/")
dftree <- as.Node(df)

我之前的请求现在类似于:

dftree$'2018'$'5'$'4'$'10'$X$Traffic

这将快几个数量级。我的问题是,首先将 df 实际组织成一棵树需要很长时间!如果我采用 1000 行的子集,则需要几分钟。所有 7,000,000 行,它都在翻腾,看不到尽头。

我的问题:

1)当数据按日期组织时,最适合快速查找的数据结构是什么?

2) df 是否太大以至于这个结构不合适?

4

1 回答 1

0

一个data.table

使用flights数据集,像您这样的查询大约需要半秒钟:

library(data.table)
library(nycflights13)
flights <- as.data.table(flights)
flights7M <- rbindlist(lapply(1:22, function(x) flights))

nrow(flights7M) / 7e6  # close enough
#> [1] 1.058439

bench::system_time({
  setkey(flights7M, year, month, day, hour, origin)
  flights7M[.(2013L, 5L, 4L, 10L, "JFK")]
})
#> process    real 
#>    1.8s 587.4ms

reprex 包(v0.2.0)于 2018 年 7 月 2 日创建。

于 2018-07-01T15:39:50.883 回答