У меня есть такой фрейм данных (df1).
f1 f2 f3 f4 f5
d1 1 0 1 1 1
d2 1 0 0 1 0
d3 0 0 0 1 1
d4 0 1 0 0 1
Столбец d1 ... d4 - это имя строки, строка f1 ... f5 - это имя столбца.
Чтобы выполнить образец (df1), я получаю новый фрейм данных со счетчиком 1, таким же, как df1. Таким образом, счетчик 1 сохраняется для всего фрейма данных, но не для каждой строки или каждого столбца.
Можно ли выполнить рандомизацию по строкам или по столбцам?
Я хочу рандомизировать столбец df1 для каждого столбца, то есть число 1 в каждом столбце остается прежним. и каждый столбец нужно изменить хотя бы один раз. Например, у меня может быть рандомизированный df2 следующим образом: (Отметил, что счетчик 1 в каждом столбце остается таким же, но счетчик 1 в каждой строке отличается.
f1 f2 f3 f4 f5
d1 1 0 0 0 1
d2 0 1 0 1 1
d3 1 0 0 1 1
d4 0 0 1 1 0
Точно так же я также хочу рандомизировать df1 построчно для каждой строки, то есть no. 1 в каждой строке остается неизменным, и каждую строку необходимо изменить (но количество измененных записей может быть другим). Например, случайный df3 может быть примерно таким:
f1 f2 f3 f4 f5
d1 0 1 1 1 1 <- two entries are different
d2 0 0 1 0 1 <- four entries are different
d3 1 0 0 0 1 <- two entries are different
d4 0 0 1 0 1 <- two entries are different
PS. Большое спасибо за помощь от Гэвина Симпсона, Джориса Мейса и Чейза за предыдущие ответы на мой предыдущий вопрос о рандомизации двух столбцов.
источник
Ответы:
Учитывая R data.frame:
Перемешать по строкам:
По умолчанию
sample()
случайным образом меняет порядок элементов, переданных в качестве первого аргумента. Это означает, что размер по умолчанию - это размер переданного массива. Передача параметраreplace=FALSE
(по умолчанию) вsample(...)
гарантирует, что выборка будет выполняться без замены, что приводит к перетасовке строк.Перемешать по столбцам:
источник
Это еще один способ перетасовать
data.frame
используемый пакетdplyr
:по строкам:
или
по столбцам:
источник
Взгляните
permatswap()
в веганский пакете. Вот пример, поддерживающий итоги как по строкам, так и по столбцам, но вы можете ослабить это и исправить только одну из сумм по строке или столбцу.Это дает:
Чтобы объяснить звонок:
times
это количество рандомизированных матриц, которое вы хотите, здесь 99burnin
- это количество замен, сделанных до того, как мы начнем брать случайные выборки. Это позволяет матрице, из которой мы делаем выборку, быть достаточно случайной, прежде чем мы начнем брать каждую из наших рандомизированных матриц.thin
говорит, что при каждомthin
обмене нужно брать только случайную ничьюmtype = "prab"
говорит, что матрица должна рассматриваться как наличие / отсутствие, т.е. двоичные данные 0/1.Следует отметить пару моментов: это не гарантирует, что какой-либо столбец или строка были рандомизированы, но если
burnin
оно достаточно длинное, должна быть хорошая вероятность того, что это произошло. Кроме того, вы можете нарисовать больше случайных матриц, чем вам нужно, и отбросить те, которые не соответствуют всем вашим требованиям.Здесь также не рассматривается ваше требование иметь разное количество изменений в строке. Опять же, вы можете выбрать больше матриц, чем хотите, а затем отбросить те, которые также не соответствуют этому требованию.
источник
вы также можете использовать
randomizeMatrix
функцию в пакете Rpicante
пример:
Опция
null.model="frequency"
поддерживает суммы столбцов и суммыrichness
строк. Хотя в основном используется для рандомизации наборов данных о присутствии и отсутствии видов в экологии сообществ, здесь он работает хорошо.Эта функция также имеет другие параметры нулевой модели, дополнительные сведения см. По следующей ссылке (стр. 36) документации.
picante
источник
Конечно, вы можете выбрать каждую строку:
перетасует строки, так что количество
1
в каждой строке не изменится. Небольшие изменения, и он также отлично работает со столбцами, но это упражнение для читателя :-Pисточник
Вы также можете "пробовать" то же количество элементов во фрейме данных, например, так:
источник
dim(M)[1]
вы можете использовать,nrow(M)
чтобы вся процедура стала однострочным:random_M <- M[nrow(M),]
Если цель состоит в том, чтобы случайным образом перемешать каждый столбец, некоторые из приведенных выше ответов не работают, поскольку столбцы перемешиваются вместе (это сохраняет корреляции между столбцами). Другие требуют установки пакета. Тем не менее, существует однострочный:
источник
Случайные выборки и перестановки в кадре данных. Если он находится в матричной форме, преобразовать в data.frame, использовать функцию образца из базового пакета indexes = sample (1: nrow (df1), size = 1 * nrow (df1)) Случайные выборки и перестановки
источник