Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Для данных 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

Ответ 2

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

построчно:

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

или

df2 <- sample_frac(df1, 1L)

столбцы:

df2 <- select(df1, one_of(sample(names(df1)))) 

Ответ 3

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

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")
  • times - количество рандомизированных матриц, которые вы хотите, здесь 99
  • burnin - количество свопов, сделанных до того, как мы начнем принимать случайные выборки. Это позволяет матрице, из которой мы произвольно выбираем случайность, прежде чем мы начнем брать каждую из наших рандомизированных матриц
  • thin говорит, что брать только случайную ничью каждые thin свопы
  • mtype = "prab" говорит, что матрица рассматривается как наличие/отсутствие, т.е. двоичные данные 0/1.

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

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

Ответ 4

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

Пример:

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 документация

Ответ 5

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

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

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

Ответ 6

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

nr<-dim(M)[1]
random_M = M[sample.int(nr),]

Ответ 7

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

Ответ 8

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

df2 = lapply(df1, function(x) { sample(x) })