Как рандомизировать (или переставлять) кадр данных по строкам и столбцам?

r random permutation

93637 просмотра

8 ответа

У меня есть датафрейм (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 для каждой строки, т. Е. Нет. 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. Большое спасибо за помощь Гэвина Симпсона, Джориса Мейс и Чейза за предыдущие ответы на мой предыдущий вопрос о рандомизации двух столбцов.

Автор: a83 Источник Размещён: 06.09.2019 07:44

Ответы (8)


214 плюса

Учитывая R data.frame:

> df1
  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0

Перемешать по рядам:

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 1 0
4 0 0 0
2 1 0 0
1 1 1 0

По умолчанию sample()случайным образом переупорядочивает элементы, переданные в качестве первого аргумента. Это означает, что размер по умолчанию равен размеру переданного массива. Передача параметра replace=FALSE(по умолчанию) sample(...)гарантирует, что выборка будет выполнена без замены, что приведет к перемешиванию строк.

Перемешать по столбцам:

> df3 <- df1[,sample(ncol(df1))]
> df3
  c a b
1 0 1 1
2 0 1 0
3 0 0 1
4 0 0 0
Автор: pms Размещён: 16.07.2012 11:35

14 плюса

Это еще один способ перемешать data.frameпакет using dplyr:

построчно:

df2 <- slice(df1, sample(1:n()))

или же

df2 <- sample_frac(df1, 1L)

столбцы:

df2 <- select(df1, one_of(sample(names(df1)))) 
Автор: Enrique Pérez Herrero Размещён: 01.03.2018 07:34

10 плюса

Взгляните permatswap()в веганский пакете. Вот пример, поддерживающий итоговые значения по строкам и столбцам, но вы можете ослабить это и исправить только одну из сумм по строкам или столбцам.

mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")

Это дает:

R> out$perm[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    0    1    0
[3,]    0    0    0    1    1
[4,]    1    0    0    0    1
R> out$perm[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    1    1
[2,]    0    0    0    1    1
[3,]    1    0    0    1    0
[4,]    0    0    1    0    1

Чтобы объяснить звонок:

out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
  1. times количество рандомизированных матриц, которое вы хотите, здесь 99
  2. burninколичество свопов, сделанных до того, как мы начнем брать случайные выборки. Это позволяет матрице, из которой мы выбираем, быть совершенно случайным, прежде чем мы начнем брать каждую из наших рандомизированных матриц
  3. thinговорит только взять случайную ничью каждые thinсвопы
  4. mtype = "prab" говорит, что обрабатывать матрицу как наличие / отсутствие, то есть двоичные данные 0/1.

Несколько вещей, на которые стоит обратить внимание, это не гарантирует, что какой-либо столбец или строка были рандомизированы, но, если они burninдостаточно длинные, должна быть хорошая вероятность того, что это произошло. Кроме того, вы можете нарисовать больше случайных матриц, чем вам нужно, и отбросить те, которые не соответствуют всем вашим требованиям.

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

Автор: Gavin Simpson Размещён: 21.06.2011 08:39

6 плюса

Вы также можете использовать randomizeMatrixфункцию в пакете Rpicante

пример:

test <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
> test
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    0
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "frequency",iterations = 1000)

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

randomizeMatrix(test,null.model = "richness",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    1    0    0    1
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0
> 

Опция null.model="frequency"поддерживает суммы столбцов и richnessподдерживает суммы строк. Хотя в основном используется для рандомизации наборов данных об отсутствии видов в экологии сообщества, он хорошо работает здесь.

Эта функция также имеет другие параметры нулевой модели, проверьте следующую ссылку для получения дополнительной информации (стр. 36) документации picante

Автор: Anne Heloise Theo Размещён: 11.09.2012 09:32

4 плюса

Конечно, вы можете попробовать каждую строку:

sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))

будет перетасовывать строки самостоятельно, поэтому число 1в каждой строке не изменится. Небольшие изменения, и это также прекрасно работает с колонками, но это упражнение для читателя :-P

Автор: binfalse Размещён: 21.06.2011 08:37

1 плюс

Вы также можете «сэмплировать» такое же количество элементов в вашем фрейме данных примерно так:

nr<-dim(M)[1]
random_M = M[sample.int(nr),]
Автор: Marcos Pedrosa Размещён: 25.11.2018 04:17

0 плюса

Случайные выборки и перестановки в кадре данных Если это в матричной форме, преобразуйте в data.frame, используйте функцию выборки из базового пакета indexes = sample (1: nrow (df1), size = 1 * nrow (df1)) Случайные выборки и перестановки

Автор: thrinadhn Размещён: 18.02.2018 04:27

0 плюса

Если цель состоит в случайном перемешивании каждого столбца, некоторые из приведенных выше ответов не работают, поскольку столбцы перемешиваются совместно (это сохраняет корреляции между столбцами). Другие требуют установки пакета. Тем не менее, существует одна строка:

df2 = lapply(df1, function(x) { sample(x) })
Автор: rimorob Размещён: 06.09.2019 04:44
Вопросы из категории :
32x32