gpt4 book ai didi

r - 我应该使用 mget()、.. 还是 with=FALSE 来选择 data.table 的列?

转载 作者:行者123 更新时间:2023-12-04 11:11:49 27 4
gpt4 key购买 nike

multiple ways通过使用保存所需列名的变量( with=FALSE..mget 、...)来选择 data.table 的列。

是否就使用哪个(何时)达成共识? 又是一个data.table -y 比其他人?

我可以提出以下论点:

  • with=FALSE..几乎同样快,而 mget速度较慢
  • ..无法“即时”选择连接的列名( 编辑 :当前 CRAN 版本 1.12.8 绝对可以,我使用的是旧版本,不能,所以这个论点是有缺陷的)
  • mget()接近 get() 的有用语法,这似乎是在 j
  • 的计算中使用变量名的唯一方法

    至 (1):
    library(data.table)
    library(microbenchmark)

    a <- mtcars
    setDT(a)

    selected_cols <- names(a)[1:4]

    microbenchmark(a[, mget(selected_cols)],
    a[, selected_cols, with = FALSE],
    a[, ..selected_cols],
    a[, .SD, .SDcols = selected_cols])

    #Unit: microseconds
    # expr min lq mean median uq max neval cld
    # a[, mget(selected_cols)] 468.483 495.6455 564.2953 504.0035 515.4980 4341.768 100 c
    # a[, selected_cols, with = FALSE] 106.254 118.9385 141.0916 124.6670 130.1820 966.151 100 a
    # a[, ..selected_cols] 112.532 123.1285 221.6683 129.9050 136.6115 2137.900 100 a
    # a[, .SD, .SDcols = selected_cols] 277.536 287.6915 402.2265 293.1465 301.3990 5231.872 100 b

    至 (2):
    b <- data.table(x = rnorm(1e6), 
    y = rnorm(1e6, mean = 2, sd = 4),
    z = sample(LETTERS, 1e6, replace = TRUE))

    selected_col <- "y"

    microbenchmark(b[, mget(c("x", selected_col))],
    b[, c("x", selected_col), with = FALSE],
    b[, c("x", ..selected_col)])
    # Unit: milliseconds
    # expr min lq mean median uq max neval cld
    # b[, mget(c("x", selected_col))] 5.454126 7.160000 21.752385 7.771202 9.301334 147.2055 100 b
    # b[, c("x", selected_col), with = FALSE] 2.520474 2.652773 7.764255 2.944302 4.430173 100.3247 100 a
    # b[, c("x", ..selected_col)] 2.544475 2.724270 14.973681 4.038983 4.634615 218.6010 100 ab

    至 (3):
    b[, sqrt(get(selected_col))][1:5]
    # [1] NaN 1.3553462 0.7544402 1.5791845 1.1007728

    b[, sqrt(..selected_col)]
    # error

    b[, sqrt(selected_col), with = FALSE]
    # error


    编辑 : 添加 .SDcols到(1)中的基准, b[, c("x", ..selected_col)]到(2)。

    最佳答案

    Should I use mget(), .. or with=FALSE to select columns of a data.table?


    你应该使用任何你喜欢的东西,只要它当然不被弃用。当呈现的解决方案之间的性能差异会产生真正的影响时,我没有看到任何现实的用例。
    使用 with=FALSE 的一些参数其他接口(interface),但那些更多地与这些接口(interface)的维护有关,而不是真正的用户使用。

    在最近的 data.table 版本中,从 1.14.1 开始,有一个新功能可以使用 data.table 以启用深度参数化 data.table 查询的方式工作。这个新界面,我们称之为“ env arg”,可以用来解决你问题中的问题。是的,另一种解决问题的方法。此 env arg 接口(interface)更通用,所以在这样一个简单的用例中,我仍然会使用 with=FALSE .下面我加了 verbose=TRUE到这个新的接口(interface)用法,以便读者可以看到如何预处理查询以替换变量。
    b = data.table(x = 1L, y = 2, z = "c")
    selected_col = "y"

    b[, c("x", selected_col), with=FALSE]
    # x y
    # <int> <num>
    #1: 1 2

    b[, .cols, env=list(.cols=I(c("x",selected_col))), verbose=T]
    #Argument 'j' after substitute: c("x", "y")
    # x y
    # <int> <num>
    #1: 1 2

    b[, .cols, env=list(.cols=as.list(c("x",selected_col))), verbose=T]
    #Argument 'j' after substitute: list(x, y)
    # x y
    # <int> <num>
    #1: 1 2
    新品 env界面也将很好地支持 (3)
    b[, sqrt(.col), env=list(.col=selected_col), verbose=T]
    #Argument 'j' after substitute: sqrt(y)
    #[1] 1.414214

    关于r - 我应该使用 mget()、.. 还是 with=FALSE 来选择 data.table 的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60263274/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com