Вот начало.Вы можете запустить summary
на среднегодовых значениях для каждой страны, чтобы получить базовые моменты выборки для каждой страны.summary
возвращает вектор из 5-значного числа + среднее;as.list
преобразует это так, что каждый элемент будет столбцом.keyby
сортирует группировку (т. Е. Запускает setkey
после выполнения операции):
df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
][ , as.list(summary(c_mean)), keyby = .(iso, matchcode)]
# iso matchcode Min. 1st Qu. Median Mean 3rd Qu. Max.
# 1: AUS AUS2011 3.5 3.5 3.5 3.5 3.5 3.5
# 2: AUS AUS2012 3.5 3.5 3.5 3.5 3.5 3.5
# 3: NLD NLD2008 4.0 4.0 4.0 4.0 4.0 4.0
# 4: NLD NLD2009 1.5 1.5 1.5 1.5 1.5 1.5
К сожалению, тип вывода summary
не гарантированно будет иметь длину 5, как здесь.В частности, для чисел это будет длина-6, если на входе есть какие-либо значения NA_real_
.Поскольку вы уже выполнили na.rm = TRUE
, это возможно только в том случае, если есть комбинация iso
- matchcode
без значений, отличных от NA
(чтобы подтвердить это, запустите summary(mean(NA_real_, na.rm = TRUE))
).Чтобы продолжить, вы можете, например, сбросить такие значения заранее:
df[ , keyby = .(iso, year, matchcode),
if (!all(is.na(C)) .(c_mean = mean(C, na.rm = TRUE)),
][ , as.list(summary(c_mean)), keyby = .(iso, matchcode)]
Или отбросить их промежуточно:
df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
][!is.na(c_mean), as.list(summary(c_mean)), keyby = .(iso, matchcode)]
Или, если вы не хотите потерять эту информацию (чтонекоторые комбинации отсутствуют), вы можете сделать вывод более согласованным:
df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
][ , {
s = summary(c_mean)
if (length(s) == 5L) s = c(s, `NA's` = 0L)
as.list(s)
}, keyby = .(iso, matchcode)]
(Вы можете проверить код summary.default
, запустив print(summary.default)
, чтобы убедиться, что это должно работать)