Измените порядок столбцов матрицы, при этом каждая строка будет иметь разный порядок

#r #permutation

#r #перестановка

Вопрос:

Я думаю, что этот вопрос не требует пояснений, но для ясности:

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

Прямо сейчас я пытаюсь произвести это переупорядочение как таковое:

 inds=matrix(nrow=nrow(datExprNorm),ncol=ncol(datExprNorm))
for(i in 1:nrow(datExprNorm)){
  inds[i,]=sample(1:ncol(datExprNorm),ncol(datExprNorm))
}
 

А затем проиндексируйте мою исходную матрицу с помощью переупорядоченных записей:

 datPermut=datExprNorm[inds]
 

Но я сталкиваюсь с этой ошибкой:

Ошибка в datExprNorm[inds] : такая индексация должна выполняться по логической или числовой матрице из 2 столбцов

Заранее спасибо!

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

1. Я думаю, что ваш вопрос не так ясен, как вы думаете, например. то, что вы делаете, НЕ переставляет вашу матрицу (которая получает все возможные комбинации строк и / или столбцов), вместо этого вы просто извлекаете случайные выборки из своей матрицы. Поэтому, пожалуйста, уточните, хотите ли вы нарисовать случайную выборку или действительно переставить свою матрицу. Пожалуйста, также уточните, хотите ли вы просто нарисовать случайную выборку строк или действительно хотите заменить значения строки случайными значениями столбцов.

2. Я хотел бы рисовать случайные выборки (без замены), заменяя значения в строке случайными значениями столбцов. Я отредактирую вопрос так, чтобы не использовать термин «перестановка».

3. Хорошо, тогда извиняюсь, я неправильно понял ваш вопрос. Да, я хочу выбрать значения из ЧИСЛА столбцов, таким образом изменив порядок столбцов. Я понимаю, что в вопросе, который я пишу строки, я также скорректирую это. Извините за путаницу.

Ответ №1:

Кажется, я запускаю его, сначала выполняя круговое преобразование в цифры, а затем воссоздавая матрицу:

 datExprNorm_numeric <- as.numeric(datExprNorm)
inds_numeric <- as.numeric(inds)

sampled <- datExprNorm_numeric[inds_numeric]

datPermut <- matrix(sampled, nrow = nrow(datExprNorm), ncol = ncol(datExprNorm))
 

Вот маленький игрушечный пример:

 x <- matrix(c(4, 3, 2, 1), nrow = 2)
 

дает:

      [,1] [,2]
[1,]    4    2
[2,]    3    1
 

и

 y <- matrix(c(1, 1, 2, 2), nrow = 2)
 

дает

      [,1] [,2]
[1,]    1    2
[2,]    1    2
 

теперь объедините:

 z <- as.numeric(x)[as.numeric(y)]

z <- matrix(z, nrow = 2, ncol = 2)
 

Результат:

      [,1] [,2]
[1,]    4    3
[2,]    4    3