Слияние двух матриц

#r #matrix

#r #матрица

Вопрос:

Я немного покопался в этом результате, но большинство вопросов, приведенных здесь, содержат информацию о функции cbind и базовой конкатенации матриц. То, что я хочу сделать, немного сложнее.

Допустим, например, у меня есть матрица NxM, первый столбец которой является уникальным идентификатором для каждой из строк (и, к счастью, в данном случае сортируется по этому идентификатору). По причинам, которые не имеют отношения к этому запросу, я разбиваю строки этой матрицы на (n_i) xM матрицы так, чтобы сумма n_i = N.

Я намереваюсь выполнить отдельный анализ для каждой из этих подматриц, а затем снова объединить данные вместе с использованием уникального идентификатора.

Пример: допустим, у меня есть матрица data размером 10xM. После моего разделения я получу матрицы subdata1 и subdata2. Если бы вы посмотрели на содержимое матриц:

 data[,1] = 1:10
subdata1[,1] = c(1,3,4,6,7)
subdata2[,1] = c(2,5,8,9,10)
 

Затем я манипулирую столбцами subdata1 и subdata2 , но сохраняю информацию в первом столбце. Я хотел бы снова объединить эти матрицы так, чтобы finaldata[,1] = 1:10 , где finaldata является результатом комбинации.

Теперь я понимаю, что я мог бы использовать rbind и сортировать матрицу, но для больших матриц это очень неэффективно.

Я знаю, что у R есть несколько отличных функций для управления данными, есть ли способ обойти эту проблему?

Комментарии:

1. Это обычная операция, известная как «разделение-применение-объединение». Из многочисленных возможностей package plyr предлагает, вероятно, самый простой синтаксис для новичка.

2. Спросите четко и приведите какой-нибудь воспроизводимый пример

Ответ №1:

Возможно, я не совсем понимаю ваш вопрос, но в качестве примера общего использования я бы обычно преобразовывал матрицы в фреймы данных, а затем делал что-то вроде этого:

 combi <- rbind(dataframe1, dataframe2)
 

Комментарии:

1. Я внесу правку в вопрос, чтобы уточнить, но я не могу этого сделать, потому что мой идентификационный ключ теперь будет не в порядке.

2. Почему ваши идентификаторы должны быть в определенном порядке? Могут ли они быть переупорядочены позже?

3. Они могли бы, но я имею дело с довольно большим объемом данных. Это текущий метод, который я использую, но я надеюсь на что-то более эффективное

Ответ №2:

Если вы знаете, что это матрицы, вы можете сделать это с помощью многомерных массивов:

 X <- matrix(1:100, 10,10)
s1 <- X[seq(1, 9,2), ]
s2 <- X[seq(2,10,2), ]
XX <- array(NA, dim=c(2,5,10) )
XX[1, ,] <- s1 #Note two commas, as it's a 3D array
XX[2, ,] <- s2
dim(XX) <- c(10,10)
XX
 

Это скопирует каждый элемент s1 и s2 в соответствующий фрагмент массива, а затем удалит дополнительное измерение. Есть приличный шанс, что rbind это на самом деле быстрее, но таким образом вам не нужно будет повторно сортировать его.

Предостережение: для этого подхода вам нужны разделения одинакового размера.

Комментарии:

1. Это интересный подход, но у меня будет большое разнообразие различий в разделении. Это, и они не обязательно будут чередоваться при разделении, mat1 может иметь c (1,2,5,7,8,9,10) и mat2 c (3,4,6)