R快速读取矩阵值的方法?

时间:2019-06-20 09:13:40

标签: r

我希望从矩阵(或向量)中尽快读取值。

标准方法如下:

# defining the matrix
x = matrix(runif(100), nrow=10)
# reading one value
x[2,3]

我尝试将data.table与索引一起使用,但是看起来慢很多:

x2 = as.data.table(x)
x2$idx = 1:10
setkey(x2, idx)
x2

x[2,3]
x2[2,3, with=F]
# we verify it is the same value

microbenchmark(x[2,3], x2[2,3, with=F])
Unit: nanoseconds
               expr    min     lq     mean median     uq    max neval
            x[2, 3]    132    157    479.9    504    677   2811   100
 x2[2, 3, with = F] 181007 185055 200142.2 188007 197573 441153   100

有什么方法可以比读取基本矩阵更快?

1 个答案:

答案 0 :(得分:0)

否,没有比matr[i, j]更快的方法来读取矩阵了。

  1. 如果有矢量,提取等效元素的速度可能会稍快。
  2. 如果您有data.table,请执行dt[['V3']][2]dt[2,3]太慢了。
  3. 如果您有一个data.frame,请执行df[['V3']][2]

您的示例在10行(即1,000,000列)中具有10,000,000个值

Unit: nanoseconds
          expr        min         lq       mean     median         uq        max neval
      vect[22]        100        900       1380       1250       2000       2900    10

       x[2, 3]        100        200       1130       1500       1700       2300    10
       x[[22]]        600       1000       1620       1600       1700       4400    10

      dt[2, 3] 1120103100 1121659900 1132672490 1121957850 1123820200 1226030600    10
     dt[2, V3] 1183598600 1185074800 1204766740 1188306650 1220468900 1262510200    10
 dt[["V3"]][2]       8900      16800      32950      39850      43200      44400    10

      df[2, 3]    7851400    7867500    8753220    8730250    9547200   10022700    10
 df[["V3"]][2]       8100      11500      20830      16150      32700      36000    10

您的示例具有10,000,000行和10列:

Unit: nanoseconds
          expr    min     lq   mean median     uq      max neval
      vect[22]    100    300    508    400    600     2000   100

       x[2, 3]    200    300    591    500    800     2600   100
       x[[22]]    200    500    727    600    900     1900   100

      dt[2, 3] 280800 288700 314736 295350 325200   509700   100
     dt[2, V3] 495700 505950 910938 522750 560700 37038500   100
 dt[["V3"]][2]   8200   9200  12048  11350  13100    23200   100

      df[2, 3]  20600  23100  29587  28700  32950    68100   100
 df[["V3"]][2]   7400   8300  11310  10500  12550    24100   100

您的100行示例:

Unit: nanoseconds
          expr    min     lq   mean median     uq    max neval
      vect[22]      0    300    416    300    500   1100   100

       x[2, 3]    100    300    542    450    800   1500   100
       x[[22]]    100    400    654    600    800   1400   100

      dt[2, 3] 256200 262000 270385 264850 268950 410100   100
     dt[2, V3] 432000 439750 457196 443900 462200 617900   100
 dt[["V3"]][2]   7800   8700  10965  10350  11400  23500   100

      df[2, 3]  16600  18450  23580  22600  27300  81800   100
 df[["V3"]][2]   7100   7850   9781   9400  10300  15100   100

编辑:数据:

library(data.table)

set.seed(1)

vect <- runif(1E7)
x <- matrix(vect, ncol = 10)
df <- as.data.frame(x)
dt <- as.data.table(x)

vect[22];x[2,3];x[[22]];dt[2, 3]; df[2, 3]