Итоги по группам через tapply(x, g, sum, na.rm = TRUE), и одна группа вернулась с 0. Все значения в ней NA. Ни одного измерения, а таблица говорит, что сумма равна нулю.
x <- c(NA_real_, NA_real_)
sum(x, na.rm = TRUE)
#> [1] 0
mean(x, na.rm = TRUE)
#> [1] NaN
max(x, na.rm = TRUE)
#> [1] -Inf
# plus a warning about no non-missing arguments
Каждый ответ по отдельности можно оправдать. Пустая сумма равна 0, пустое среднее - это 0/0. Но рядом в сводной таблице это три разных способа сказать, что ничего не было, и упомянуть об этом удосуживается только max. Хуже всех 0, потому что он похож на измерение.
Версия, которая теперь пойдёт в мои скрипты, возвращает NA, когда складывать нечего.
sum_or_na <- function(x) {
if (all(is.na(x))) NA_real_ else sum(x, na.rm = TRUE)
}
Мне больше нравится NA, потому что читатель таблицы хотя бы видит, что у группы не было данных.