Tengo un marco de datos (df1) como este.
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
La columna d1 ... d4 es el nombre de la fila, la fila f1 ... f5 es el nombre de la columna.
Para hacer la muestra (df1), obtengo un nuevo marco de datos con un recuento de 1 igual que df1. Por lo tanto, el recuento de 1 se conserva para todo el marco de datos, pero no para cada fila o columna.
¿Es posible hacer la aleatorización por filas o por columnas?
Quiero aleatorizar la columna df1 para cada columna, es decir, el número de 1 en cada columna sigue siendo el mismo. y cada columna debe cambiarse al menos una vez. Por ejemplo, puedo tener un df2 aleatorio como este: (Noté que el recuento de 1 en cada columna sigue siendo el mismo, pero el recuento de 1 en cada fila es diferente.
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
Del mismo modo, también quiero aleatorizar la fila df1 para cada fila, es decir, el no. de 1 en cada fila sigue siendo el mismo, y es necesario cambiar cada fila (pero el número de entradas cambiadas podría ser diferente). Por ejemplo, un df3 aleatorio podría ser algo como esto:
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
PD. Muchas gracias por la ayuda de Gavin Simpson, Joris Meys y Chase por las respuestas anteriores a mi pregunta anterior sobre la distribución aleatoria de dos columnas.
fuente
Respuestas:
Dado el R data.frame:
Mezclar por filas:
Por defecto,
sample()
reordena aleatoriamente los elementos pasados como primer argumento. Esto significa que el tamaño predeterminado es el tamaño de la matriz pasada. Pasar el parámetroreplace=FALSE
(el predeterminado) asample(...)
asegura que el muestreo se realiza sin reemplazo, lo que logra una mezcla inteligente de filas.Mezclar por columnas:
fuente
Esta es otra forma de mezclar el
data.frame
paquete usingdplyr
:en hilera:
o
por columna:
fuente
Eche un vistazo
permatswap()
en el paquete vegano . A continuación, se muestra un ejemplo que mantiene los totales de filas y columnas, pero puede relajarlo y corregir solo una de las sumas de filas o columnas.Esto da:
Para explicar la llamada:
times
es el número de matrices aleatorias que desea, aquí 99burnin
es el número de intercambios realizados antes de empezar a tomar muestras aleatorias. Esto permite que la matriz de la que tomamos muestras sea bastante aleatoria antes de comenzar a tomar cada una de nuestras matrices aleatorias.thin
dice que solo tome un sorteo aleatorio en cadathin
intercambiomtype = "prab"
dice tratar la matriz como presencia / ausencia, es decir, datos binarios 0/1.Un par de cosas a tener en cuenta, esto no garantiza que ninguna columna o fila haya sido aleatorizada, pero si
burnin
es lo suficientemente larga, debería haber una buena posibilidad de que eso haya sucedido. Además, puede dibujar más matrices aleatorias de las que necesita y descartar las que no coincidan con todos sus requisitos.Su requisito de tener diferentes números de cambios por fila tampoco se trata aquí. Nuevamente, puede muestrear más matrices de las que desee y luego descartar las que no cumplan con este requisito también.
fuente
también puede usar la
randomizeMatrix
función en el paquete Rpicante
ejemplo:
La opción
null.model="frequency"
mantiene las sumas de columna yrichness
mantiene las sumas de fila. Aunque se utiliza principalmente para aleatorizar conjuntos de datos de ausencia de presencia de especies en ecología comunitaria, funciona bien aquí.Esta función también tiene otras opciones de modelo nulo, consulte el siguiente enlace para obtener más detalles (página 36) de la documentación
picante
fuente
Por supuesto, puede probar cada fila:
barajará las filas en sí, por lo que el número de
1
en cada fila no cambia. Pequeños cambios y también funciona muy bien con columnas, pero este es un ejercicio para el lector :-Pfuente
También puede "muestrear" la misma cantidad de elementos en su marco de datos con algo como esto:
fuente
dim(M)[1]
, puede usarnrow(M)
para que todo el procedimiento se convierta en una sola línea:random_M <- M[nrow(M),]
Si el objetivo es mezclar aleatoriamente cada columna, algunas de las respuestas anteriores no funcionan, ya que las columnas se mezclan de forma conjunta (esto preserva las correlaciones entre columnas). Otros requieren la instalación de un paquete. Sin embargo, existe una sola línea:
fuente
Muestras aleatorias y permutaciones en un marco de datos Si está en forma de matriz, conviértalo en data.frame, use la función de muestra del paquete base índices = muestra (1: nrow (df1), tamaño = 1 * nrow (df1)) Muestras aleatorias y permutaciones
fuente