【问题标题】:how can I avoid this function modifies the class of my initial object我怎样才能避免这个函数修改我的初始对象的类
【发布时间】:2017-10-26 10:13:10
【问题描述】:

正如标题所说,

# install.packages(c("dplyr"), dependencies = TRUE)
library(dplyr)
tbl <- tibble(id = rep(0:1, c(7, 10)),
             grp = rep(c(0,1,0,1,2), c(3,4,2,5,3)),
             LET = rep(c('A', 'B', 'A', 'B', 'A', 'B'), c(1,4, 3, 3, 4, 2)))

# install.packages(c("data.table"), dependencies = TRUE)
library(data.table) 
class(tbl)
#> [1] "tbl_df"     "tbl"        "data.frame"
dt_by_akrun  <- function(x) {foo <- x; setDT(foo)[, grp_LET := LET[1], .(id, grp)]; as_tibble(foo)}
invisible(dt_by_akrun(tbl))
class(tbl)
#> [1] "data.table" "data.frame"

【问题讨论】:

    标签: r function data.table


    【解决方案1】:

    我们可以将其分配给copy(x),而不是分配foo &lt;-x

    dt_by_akrun  <- function(x) {foo <- copy(x)
                      setDT(foo)[, grp_LET := LET[1], .(id, grp)]
                       as_tibble(foo)
                   }
    invisible(dt_by_akrun(tbl))
    class(tbl)
    #[1] "tbl_df"     "tbl"        "data.frame"
    

    【讨论】:

    • 谢谢,我用微基准比较来更新this question。请随意优化任何功能。
    • @EricFail 感谢 cmets。我检查了你的微基准。它是基于更大的数据集吗?如果不是,那么比较可能不准确,因为当数据集大小增加时,您会发现 data.table 解决方案的效率差异
    • 它基于我提供的 dummy 数据。如果我有时间在我的生产数据上运行它,我可能会更新它。
    • @EricFail 如果您在生产数据上运行,您会发现不同之处。我会在至少 1e6 或大于该数量的行上运行(假设您只有更少的列数
    • @Eric 您可以为基准测试制作一个可重复的大型示例(例如,将示例数据生成编写为行数的函数)。顺便说一句,akrun 的方法在你的基准测试中只输给了 tidyverse,因为它有两个副本——使用 data.table(或者 dtplyr,也许)核心操作应该更快。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多