данных.стол против dplyr: можно сделать что-то хорошо другой не может или делает плохо?


обзор

data.tabledplyrdplyr vignettes

я относительно знакома , не так много . я читал через некоторые <а с href="http://rpubs.com/hadley/dplyr-intro в" атрибут rel="noreferrer"> виньеток</а> и примеров, которые выскочили на так, и до сих пор мои выводы, что:

  • data.table and dplyr are comparable in speed, except when there are many (i.e. >10-100k) groups, and in some other circumstances (see benchmarks below)
  • dplyr has more accessible syntax
  • dplyr abstracts (or will) potential db interactions
  • there are some minor functionality differences (see "examples/usage" below)
  • data.tabledata.table

    в моем уме 2. не несет много веса, потому что я довольно хорошо знаком с ним , хотя я понимаю, что для новичков в обоих это будет большой фактор. я хотел бы избежать спор о том, что является более интуитивным, поскольку это не имеет отношения на мой конкретный вопрос задал с точки зрения кого-то уже знакомы . я также хотел бы избежать дискуссии на тему о том, как "более понятный" приводит к более быстрому анализ (конечно, верно, но, опять же, не то, что я наиболее заинтересованы о здесь).

    вопрос

    что я хочу знать:

  • are there analytical tasks that are a lot easier to code with one or the other package for people familiar with the packages (i.e. some combination of keystrokes required vs. required level of esotericism, where less of each is a good thing).
  • are there analytical tasks that are performed substantially (i.e. more than 2x) more efficiently in one package vs. another.
  • recent so questiondplyrdata.tabledplyr

    я думал об этом немного больше, потому что до этого момента я не думала, что будет предлагать гораздо больше, чем я уже могу сделать во . вот решение (данные на конец квартала):

    dat %.%  group_by(name, job) %.%  filter(job != "boss" | year == min(year)) %.%  mutate(cumu_job2 = cumsum(job2))
    data.tabledata.table

    который был намного лучше, чем мой хак попытка решения. что сказал, хороших решений также очень хорошо (спасибо жан-роберт, арун, и заметьте, здесь я предпочитал один оператор за строго самое оптимальное решение):

    setdt(dat)[,  .sd[job != "boss" | year == min(year)][, cumjob := cumsum(job2)],   by=list(id, job)]
    data.table

    синтаксис для последнего может показаться очень эзотерической, но на самом деле это довольно просто, если вы привыкли (т. е. не использовать некоторые из более эзотерических трюков).

    dplyrdata.table

    в идеале то, что я хотел бы видеть некоторые хорошие примеры были или способ существенно более сжатым или выполняет значительно лучше.

    примеры

    использование

  • dplyr does not allow grouped operations that return arbitrary number of rows (from eddi's question, note: this looks like it will be implemented in dplyr 0.5, also, @beginner shows a potential work-around using do in the answer to @eddi's question).
  • data.table supports rolling joins (thanks @dholstius) as well as overlap joins
  • data.table internally optimises expressions of the form dt[col == value] or dt[col %in% values] for speed through automatic indexing which uses binary search while using the same base r syntax. see here for some more details and a tiny benchmark.
  • dplyr offers standard evaluation versions of functions (e.g. regroup, summarize_each_) that can simplify the programmatic use of dplyr (note programmatic use of data.table is definitely possible, just requires some careful thought, substitution/quoting, etc, at least to my knowledge)
  • критериями

  • i ran my own benchmarks and found both packages to be comparable in "split apply combine" style analysis, except when there are very large numbers of groups (>100k) at which point data.table becomes substantially faster.
  • @arun ran some benchmarks on joins, showing that data.table scales better than dplyr as the number of groups increase (updated with recent enhancements in both packages and recent version of r). also, a benchmark when trying to get unique values has data.table ~6x faster.
  • (unverified) has data.table 75% faster on larger versions of a group/apply/sort while dplyr was 40% faster on the smaller ones (another so question from comments, thanks danas).
  • matt, the main author of data.table, has benchmarked grouping operations on data.table, dplyr and python pandas on up to 2 billion rows (~100gb in ram).
  • an older benchmark on 80k groups has data.table ~8x faster
  • данные

    это первый пример, который я показал в разделе вопрос.

    dat <- structure(list(id = c(1l, 1l, 1l, 1l, 1l, 1l, 1l, 1l, 2l, 2l, 2l, 2l, 2l, 2l, 2l, 2l), name = c("jane", "jane", "jane", "jane", "jane", "jane", "jane", "jane", "bob", "bob", "bob", "bob", "bob", "bob", "bob", "bob"), year = c(1980l, 1981l, 1982l, 1983l, 1984l, 1985l, 1986l, 1987l, 1985l, 1986l, 1987l, 1988l, 1989l, 1990l, 1991l, 1992l), job = c("manager", "manager", "manager", "manager", "manager", "manager", "boss", "boss", "manager", "manager", "manager", "boss", "boss", "boss", "boss", "boss"), job2 = c(1l, 1l, 1l, 1l, 1l, 1l, 0l, 0l, 1l, 1l, 1l, 0l, 0l, 0l, 0l, 0l)), .names = c("id", "name", "year", "job", "job2"), class = "data.frame", row.names = c(na, -16l))