У меня есть большая матрица mat
с именами строк group_label_x
и именами group_label_y
. Я хочу агрегировать mat
в ave_mat
, по group_label_x
и group_label_y
, где значение ave_mat[i,j]
является средним значением mat[ group_label_x[i], group_label_y[j] ]
. Это может быть достигнуто с помощью двойного цикла или двойного применения функции aggregate
(aggregate( mat, by = list(group_label_x), FUN='mean' )
). Но есть ли подход, который может достичь более высокой скорости? (поскольку у меня много матриц для агрегирования).
Следующий код генерирует демонстрационную случайную матрицу из приблизительно 1E4 строк и 2E4 столбцов, которые я хочу объединить в матрицу ~ 1E3 x 1E3:
set.seed(1)
dim_x_raw = 1E4
dim_y_raw = 2E4
n_groups_x = 1E3
n_groups_y = 1E3
group_len_x = diff(sort(sample( 1:dim_x_raw, n_groups_x )))
group_label_x = rep( paste0('group_', 1:length(group_len_x)), group_len_x )
group_len_y = diff(sort(sample( 1:dim_y_raw, n_groups_y )))
group_label_y = rep( paste0('group_', 1:length(group_len_y)), group_len_y )
mat = matrix( runif( length(group_label_x)*length(group_label_y) ), length(group_label_x) )
######################################
Мой код агрегации (медленно):
ave_mat_x = aggregate( mat, by = list(group_label_x), FUN='mean' )
ave_mat = aggregate( t(ave_mat_x), by = list(group_label_y), FUN='mean' )