#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)