问题:我有一个dt
包含大约一百万个 x 和 y 值的大型 data.table。这些 xy 组合代表二维平面上的事件。我知道那架飞机的尺寸(iwidth
, iheight
)。
我想创建一个除 data.table 中列出的 xy 值之外的任何地方都为 0 的矩阵。在这些点,矩阵值应该是 1。一般来说,这很容易做到,但是要设置一百万个 xy 值,常规方法不适合。
方法:由于不是每个 xy 组合都会在 data.table 中表示,因此我首先创建一个具有正确维度的 0 矩阵。然后我将data.table指示的点处的0替换为1。
## initial setup (for easier testing we just use a data.frame, not a data.table)
iwidth = 4288
iheight = 8576
dt = data.frame( xval=sample(iwidth ,10), yval=sample(iheight ,10) )
## simple approach
mx = matrix(ncol=iwidth, nrow=iheight, data=0)
mx[dt$xval, dt$yval] = 1
## biganalytics approach
library(biganalytics)
mx = as.big.matrix(matrix(ncol=iwidth, nrow=iheight, data=0))
mx[dt$xval, dt$yval] = 1
失败:对于小数据,这工作得很好。但是,当您实际上有一个包含一百万行的 data.table 时,它需要很长时间。我认为该biganalytics
软件包可能会有所帮助,但这仅适用于小数据,而大数据实际上更糟(请参阅下面的基准)。我也尝试过apply
,或者with
但对我来说他们也没有工作(我认为他们应该更慢)。
这些是上述方法的微基准测试结果(n=1)(dt5、dt50 等代表具有 5 行、50 行等的 data.table)。一旦我们到达很长的 data.tables(即矩阵中要替换的许多值),所花费的时间就会大大增加。
## Regular matrix:
Unit: milliseconds
expr min lq mean median uq max neval
dt5 130.8255 130.8255 130.8255 130.8255 130.8255 130.8255 1
dt50 87.2308 87.2308 87.2308 87.2308 87.2308 87.2308 1
dt500 86.7591 86.7591 86.7591 86.7591 86.7591 86.7591 1
dt5000 129.6120 129.6120 129.6120 129.6120 129.6120 129.6120 1
dt50000 4340.6080 4340.6080 4340.6080 4340.6080 4340.6080 4340.6080 1
## Biganalytics matrix:
Unit: milliseconds
expr min lq mean median uq max neval
dt5 0.988101 0.988101 0.988101 0.988101 0.988101 0.988101 1
dt50 0.779401 0.779401 0.779401 0.779401 0.779401 0.779401 1
dt500 9.814602 9.814602 9.814602 9.814602 9.814602 9.814602 1
dt5000 202.574901 202.574901 202.574901 202.574901 202.574901 202.574901 1
dt50000 19939.191600 19939.191600 19939.191600 19939.191600 19939.191600 19939.191600 1