group_by + nest的性能替代

时间:2018-12-08 11:46:14

标签: r dplyr tidyr

让我们假设我想在组内做某事,例如从每个组中提取第一行。使用tidyverseiris数据集,这很容易:

iris %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(first_within_group = map(data, ~head(.x, 1))) %>% 
  select(-data) %>% 
  unnest()

但是,对于更大的数据集,我会遇到性能问题。是否有group_by() + nest()的替代方案,在速度方面会更有效率?效果是否取决于group_by()内部的因素数量?

2 个答案:

答案 0 :(得分:1)

<?php require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../config/db.php'; $app = new \Slim\App(['settings' => $config]); require __DIR__ . '/../app/dependencies.php'; require __DIR__ . '/../app/routes.php'; $app->run(); 方式

data.table

基准

library( data.table )
dt <- as.data.table( iris )
dt[ dt[, .I[1], Species ]$V1]

答案 1 :(得分:0)

使用切片

iris %>% group_by(Species) %>% slice(1)

使用data.table

library(data.table)
irisDT = as.data.table(iris)
irisDT[ ,.SD[1], by = Species]

基准

 expr        min        lq      mean    median       uq       max neval
  map   8024.127 8274.1645 9048.5633 8625.7005 9254.004 12900.339   100
  slice  943.808  986.0910 1274.0415 1082.6330 1428.091  4274.758   100
  dt[]   657.492  701.5495  847.3838  757.3865  780.738  4405.899   100