Ответ 1
Проблема с dplyr заключается в том, что функция sum используется с выражением и большим количеством идентификаторов/групп. Из того, что Арун говорит в комментариях, я думаю, проблема с data.table похоже.
Рассмотрим приведенный ниже код: я уменьшил его до минимума, необходимого для иллюстрации проблемы. dplyr медленнее при суммировании выражения, даже если выражение включает только функцию идентификации, поэтому проблемы с производительностью не имеют ничего общего с оператором сравнения, чем оператор сравнения. Напротив, dplyr является быстрым при суммировании вектора. Еще большее увеличение производительности достигается за счет сокращения количества идентификаторов/групп от миллиона до десяти.
Причина в том, что гибридная оценка, т.е. оценка на С++, работает только в том случае, если сумма используется с вектором. С выражением в качестве аргумента оценка выполняется в R, что добавляет накладные расходы для каждой группы. Подробности приведены в связанной виньетке. Из профиля кода кажется, что накладные расходы в основном происходят из функции обработки ошибок tryCatch.
##########################
### many different IDs ###
##########################
df <- data.frame(id = 1:1e6, value = runif(1e6))
# sum with expression as argument
system.time(df %>% group_by(id) %>% summarise(sum(identity(value))))
# user system elapsed
# 80.492 0.368 83.251
# sum with vector as argument
system.time(df %>% group_by(id) %>% summarise(sum(value)))
# user system elapsed
# 1.264 0.004 1.279
#########################
### few different IDs ###
#########################
df$id <- rep(1:10, each = 1e5)
# sum with expression as argument
system.time(df %>% group_by(id) %>% summarise(sum(identity(value))))
# user system elapsed
# 0.088 0.000 0.093
# sum with vector as argument
system.time(df %>% group_by(id) %>% summarise(sum(value)))
# user system elapsed
# 0.072 0.004 0.077
#################
### profiling ###
#################
df <- data.frame(id = 1:1e6, value = runif(1e6))
profvis::profvis({ df %>% group_by(id) %>% summarise(sum(identity(value))) })
Код профиля: