Я думаю, что самая быстрая замена aggregate()
будет использовать data.table
library(data.table)
(dt <- setDT(df)[, lapply(.SD, mean), by = ID])
# ID a b c d e
# 1: no 25.000000 26.00000 24.66667 39.00000 39.66667
# 2: bo 40.666667 25.33333 31.33333 37.00000 19.33333
# 3: fo 5.333333 28.00000 53.33333 11.66667 29.33333
# 4: to 30.666667 47.33333 27.00000 41.33333 28.00000
Для ряда вычитания, мы могли бы написать функцию и использовать его с Map()
.
f <- function(x, y) {
dt[ID == x, -1, with = FALSE] - dt[ID == y, -1, with = FALSE]
}
rbindlist(Map(f, c("bo", "fo", "to", "to"), c("no", "no", "bo", "fo")))
# a b c d e
# 1: 15.66667 -0.6666667 6.666667 -2.000000 -20.333333
# 2: -19.66667 2.0000000 28.666667 -27.333333 -10.333333
# 3: -10.00000 22.0000000 -4.333333 4.333333 8.666667
# 4: 25.33333 19.3333333 -26.333333 29.666667 -1.333333
Существует, вероятно, лучший способ, чтобы написать функцию f()
и что последний звонок в data.table и я буду стараться улучшить его, если это возможно. Обратите внимание, что этот результат не будет соответствовать вашим требованиям из-за использования sample()
без установки семени.
Другой возможностью было бы сделать следующее. Это даст вам имена строк, которые вы хотите.
A <- c("bo", "fo", "to", "to")
B <- c("no", "no", "bo", "fo")
df2 <- as.data.frame(rbindlist(Map(f, A, B)))
rownames(df2) <- paste(A, B, sep = "-")
df2
# a b c d e
# bo-no 15.66667 -0.6666667 6.666667 -2.000000 -20.333333
# fo-no -19.66667 2.0000000 28.666667 -27.333333 -10.333333
# to-bo -10.00000 22.0000000 -4.333333 4.333333 8.666667
# to-fo 25.33333 19.3333333 -26.333333 29.666667 -1.333333
Метод кадр данных должен быть быстрее, чем метод формулы 'совокупности (DF [-1], DF [1], среднее значение)' –
Есть ли применять подход? – Al14
что вы хотите сделать? с более быстрым методом? каков ваш вопрос о выводе? –