r - Group_by 并在大型数据帧上缓慢变异

标签 r dataframe data.table tidyverse

我正在处理大型(最少 8 百万行)dataframes并希望根据几个分组变量和 rmultinom 进行一些基本计算.就我的代码而言,完成计算至少需要约 1 秒,这不是问题,但我需要执行数千次,所以我真的很想加快速度。

我目前正在使用 dataframestidyverse但我与其中任何一个都没有关系。我尝试使用 data.table 来实现但想不通。任何关于我如何加快速度的建议将不胜感激。

一个例子(真实数据可以大一个数量级或更多):

library(tidyverse)
library(microbenchmark)

# create dummy data
df <- data.frame(fact = rep(letters, each = 312000), 
                 month = rep(month.name, 26), 
                 num = rep(sample(10000:100000, 12), 26), 
                 prob = runif(312))

# Order by month     
df <- df[order(df$month), ]

# group by two factor variables and calculate new variable 
microbenchmark({
  df2 <- df %>%
    group_by(fact, month) %>%
    mutate(res = ifelse(prob > 0, c(rmultinom(1, num[1], prob = prob)), 0))}, times = 10)


 > Unit: milliseconds
 > min      lq       mean     median   uq        max         neval
 > 816.3126 822.4083 840.7966 834.6163 855.5139  879.9345    10

最佳答案

评论太长了,所以我把它贴在这里。

运行

library(profr)
plot(profr(
df %>% group_by(fact, month) %>% 
   mutate(res = ifelse(prob > 0, c(rmultinom(1, num[1], prob = prob)), 0))
))

我得到以下信息:

enter image description here

所以,看起来你真的很想为 multinom 找到一个更快的实现。 ,这似乎是瓶颈。这个瓶颈对于 dplyr 都是一样的和 data.table ,这意味着只会加速 rmultinorm将为您带来显着的速度提升。

关于r - Group_by 并在大型数据帧上缓慢变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52709593/

相关文章:

python - 使用python将多行csv文件合并为一个

python - 在 Pandas 数据框列中添加多个常量值

python - 使用 python 数据框,将满足条件的行数列添加到满足条件的每一行

r - 重新探究data.table与dplyr的内存使用

css - 在 Shiny 中控制 sliderInput 的外观

css - 如何降低 Shiny 中输入字段的高度?

java.lang.UnsatisfiedLinkError : Java cannot find my dll's?

r - data.table中以数据驱动的图名称

r - 功能命名冲突

R write.table : invalid 'col.names' specification