R 是否可以加快data.table代码的速度?

R 是否可以加快data.table代码的速度?,r,performance,dplyr,data.table,R,Performance,Dplyr,Data.table,我决定将我的代码从dplyr重写为data.table,因为我听说它更快 令人惊讶的是,我在执行时间上只获得了微不足道的加速。是我的数据太小还是我用可怕的data.table风格写的 除了输出的类之外,结果是相同的 我不是故意使用setDT(),因为这是主观的 编辑:我做了一个类似的可复制的例子 pacman::p_load(gapminder, data.table, dplyr, stringr, microbenchmark) gapminder -> gapminder as_t

我决定将我的代码从dplyr重写为data.table,因为我听说它更快

令人惊讶的是,我在执行时间上只获得了微不足道的加速。是我的数据太小还是我用可怕的data.table风格写的

除了输出的类之外,结果是相同的

我不是故意使用setDT(),因为这是主观的

编辑:我做了一个类似的可复制的例子

pacman::p_load(gapminder, data.table, dplyr, stringr, microbenchmark)

gapminder -> gapminder
as_tibble(gapminder) -> gapminder_tibble
as.data.table(gapminder) -> gapminder_data.table

microbenchmark(
  dplyr = {
    gapminder_tibble %>% 
      filter(year > 1900, year < 1990) %>% 
      mutate(country = str_sub(str_to_lower(country), 5)) %>% 
      count(country)
  },

  data.table = {
    gapminder_data.table[year > 1900 & year < 1990][, country := str_sub(str_to_lower(country), 5)][, .(n = .N), by = country]
  },

  times = 1000
)

为什么呢?如何使它更快?有什么建议吗?在data.table中写入数据的最快方法是什么?

您可以通过避免(不必要的)链接并将
str_()和
str_sub()

gapminder_数据表【1900年和1990年】,
(n=0.n),
by=(国家=str_至较低(str_子(国家,5)))]

您可以
setkey
让它运行得更快一点,这主要取决于执行此操作的行数。我使用的data.table通常超过100.000行。当处理1.000.000及以上时,差异非常显著。在您的情况下,尤其是在data.table中,mutate和group_by(在计数范围内)应该更有效。当您执行基准测试时,请确保您正在对苹果进行比较。目前,您正在为每次迭代使用
as.data.table
,这会造成一些(轻微但可能不是无关紧要的)开销。比较应该只属于核心问题,在微基准测试之前做过任何
,并且只做过一次
。如果你做了一个可重复的例子,这将非常有用。3毫秒已经太快了,所以这个例子没有说明需要提高速度的情况。不过,通常使用较大的数据和某些操作会带来一些好处。
Unit: milliseconds
       expr      min       lq     mean   median       uq     max neval cld
      dplyr 2.441601 2.756801 3.165089 2.965350 3.181802 29.1171  1000  a 
 data.table 2.646601 3.101201 3.548372 3.383252 3.661500 11.9474  1000   b
gapminder_data.table[year > 1900 & year < 1990, 
                     .(n = .N), 
                     by = .(country = str_to_lower(str_sub(country, 5)))]