Столбцы бинов и агрегированные данные с использованием случайной выборки с заменой для итеративно больших размеров бинов - PullRequest
0 голосов
/ 24 сентября 2019

Ниже приведен пример матрицы:

mat<- matrix(c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,
   2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
   0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
   0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,
   1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0), nrow=16, ncol=6)
dimnames(mat)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
          c("1", "2", "3", "4", "5", "6"))

Я хочу сгруппировать столбцы или столбцы, а затем объединить данные для каждой группы.Во-первых, я хотел бы разместить два столбца данных.Сгруппированные столбцы должны быть смежными друг с другом (т. Е. Столбцы 1 и 2, столбцы 5 и 6, НЕ столбцы 4 и 6).Где начинается биннинг в матрице, случайное.Например, в матрице из 600 столбцов первые два столбца могут быть столбцами 545 и 546 и следующими столбцами 3 и 4.Я хотел бы сделать выборку без замены, чтобы комбинация не бралась дважды.Агрегация определяется как вычисление сумм строк для ячейки rowSums().Обобщенные результаты будут новым столбцом в матрице результатов.Количество столбцов в матрице результатов будет ограничено количеством случайных выборок.

Размер корзины продолжает увеличиваться.Затем размер ячейки увеличивается до 3, так что объединяются 3 смежных столбца данных.Агрегированные данные будут помещены в другую матрицу результатов.Этот процесс будет продолжаться до тех пор, пока корзина не станет размером фрейма данных.Все матрицы результатов будут помещены в список матриц.

Я разместил аналогичный вопрос для альтернативной техники биннинга здесь: Метод перемещения окна для агрегирования данных

Я попытался изменить код так, чтобы метод биннинга случайно выбиралn смежных столбцов и вычисляет суммы строк:

lapply(seq_len(ncol(mat) - 1), function(j) do.call(cbind, 
lapply(sample(ncol(mat)-j, replace = FALSE, size = length(x)), function(i) rowSums(mat[, i:(i + j)]))))

Мне нужна помощь в изменении этой строки кода для случайной выборки без замены i смежных столбцов с размером ячейки i для n выборок и агрегирования каждой выборки с использованием сумм строк.Обратите внимание, что комбинации столбцов не могут быть пересчитаны, но столбцы могут быть пересчитаны, если они являются частью новых комбинаций.

1 Ответ

0 голосов
/ 24 сентября 2019

Здесь приведен параматизированный подход, который выбирает из возможных комбинаций без замены и вычисляет сводку на основе исходных данных, а также маркирует столбцы результатов, чтобы вы могли видеть, откуда они пришли (и быть уверенными, что повторений нет).

set.seed(47)
n_cols_in_bin = 2
n_samps = 4

starting_cols = sample(1:(ncol(mat) -  (n_cols_in_bin - 1)), size = n_samps) 
result = sapply(starting_cols, function(x) rowSums(mat[, x:(x + n_cols_in_bin - 1)]))
colnames(result) = paste0("cols", starting_cols, "to", starting_cols + n_cols_in_bin - 1)
result
#   cols5to6 cols2to3 cols3to4 cols4to5
# a        1        2        0        0
# c        1        0        1        1
# f        0        1        1        0
# h        0        1        1        0
# i        1        2        1        1
# j        0        0        1        1
# l        0        0        0        0
# m        1        0        0        1
# p        1        0        0        0
# q        1        0        0        1
# s        2        0        0        1
# t        2        0        0        0
# u        1        0        0        0
# v        1        0        0        1
# x        0        1        0        0
# z        1        0        0        1

Для удобства мы можем поставить его в функцию:

foo = function(mat, n_cols_in_bin, n_samps) {
  starting_cols = sample(1:(ncol(mat) -  (n_cols_in_bin - 1)), size = n_samps)
  result = sapply(starting_cols, function(x)
    rowSums(mat[, x:(x + n_cols_in_bin - 1)]))
  colnames(result) = paste0("cols", starting_cols, "to", starting_cols + n_cols_in_bin - 1)
  result
}

foo(mat, n_cols_in_bin = 3, n_samps = 2)
#   cols3to5 cols4to6
# a        0        1
# c        1        2
# f        1        0
# h        1        0
# i        2        1
# j        1        1
# l        0        0
# m        1        1
# p        0        1
# q        1        1
# s        1        2
# t        0        2
# u        0        1
# v        1        1
# x        0        0
# z        1        1
...