Comment randomiser (ou permuter) un dataframe en ligne et en colonne?

J’ai un dataframe (df1) comme ça.

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 colonne d1 … d4 est le nom de la colonne, la ligne f1 … f5 est le nom de la colonne.

Pour faire un échantillon (df1), je reçois un nouveau dataframe avec un compte de 1 identique à df1. Ainsi, le nombre de 1 est conservé pour l’ensemble du dataframe mais pas pour chaque ligne ou chaque colonne.

Est-il possible de faire la randomisation par ligne ou par colonne?

Je veux randomiser la colonne df1 pour chaque colonne, c’est-à-dire que le nombre de 1 dans chaque colonne rest le même. et chaque colonne doit être changée au moins une fois. Par exemple, je peux avoir un df2 aléatoire comme ceci: (Noté que le nombre de 1 dans chaque colonne rest le même mais que le nombre de 1 dans chaque ligne est différent.

  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 

De même, je veux aussi randomiser la ligne df1 pour chaque ligne, c.-à-d. Le non. de 1 dans chaque ligne rest le même, et chaque ligne doit être modifiée (mais le nombre d’entrées modifiées peut être différent). Par exemple, un df3 aléatoire pourrait être quelque chose comme ceci:

  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 Merci beaucoup de l’aide de Gavin Simpson, Joris Meys et Chase pour les réponses précédentes à ma question précédente sur la randomisation de deux colonnes.

Vu le R data.frame:

 > df1 abc 1 1 1 0 2 1 0 0 3 0 1 0 4 0 0 0 

Mélangez en rangée:

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

Par défaut, sample() réordonne aléatoirement les éléments passés en premier argument. Cela signifie que la taille par défaut est la taille du tableau transmis. Le fait de passer le paramètre replace=FALSE (la valeur par défaut) pour sample(...) garantit que l’échantillonnage est effectué sans remplacement, ce qui permet d’effectuer un mélange aléatoire par ligne.

Mélangez en colonnes:

 > df3 <- df1[,sample(ncol(df1))] > df3 cab 1 0 1 1 2 0 1 0 3 0 0 1 4 0 0 0 

Jetez un oeil à permatswap() dans le paquetage végétalien . Voici un exemple de maintien des totaux des lignes et des colonnes, mais vous pouvez assouplir cela et ne corriger qu’une des sums des lignes ou des colonnes.

 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") 

Cela donne:

 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 

Pour expliquer l'appel:

 out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab") 
  1. times est le nombre de masortingces aléatoires que vous voulez, ici 99
  2. burnin est le nombre de swaps effectués avant de commencer à prendre des échantillons aléatoires. Cela permet à la masortingce à partir de laquelle nous échantillonnons d’être assez aléatoire avant de commencer à prendre chacune de nos masortingces randomisées.
  3. thin dit seulement prendre un tirage au sort chaque swaps thin
  4. mtype = "prab" dit de traiter la masortingce comme présence / absence, c'est-à-dire des données binarys 0/1.

Quelques points à noter, cela ne garantit pas qu'une colonne ou une ligne a été aléatoire, mais si le temps de burnin est suffisamment long, il y a de fortes chances que cela se produise. En outre, vous pouvez dessiner plus de masortingces aléatoires que vous en avez besoin et en éliminer celles qui ne correspondent pas à toutes vos exigences.

Votre exigence d'avoir un nombre différent de changements par ligne n'est pas non plus couverte ici. Encore une fois, vous pouvez échantillonner plus de masortingces que vous le souhaitez, puis éliminer celles qui ne répondent pas à cette exigence.

vous pouvez également utiliser la fonction randomizeMasortingx dans le paquet picante R

Exemple:

 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 randomizeMasortingx(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 randomizeMasortingx(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 > 

L’option null.model="frequency" maintient les sums des colonnes et la richness maintient les sums des lignes. Bien qu’il soit principalement utilisé pour randomiser les ensembles de données d’absence de présence d’espèces en écologie communautaire, il fonctionne bien ici.

Cette fonction possède également d’autres options de modèle nul. Consultez le lien suivant pour plus de détails (page 36) de la documentation de picante .

Bien sûr, vous pouvez échantillonner chaque ligne:

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

va mélanger les lignes elle-même, donc le nombre de 1 dans chaque ligne ne change pas. Petits changements et ça marche aussi très bien avec les colonnes, mais c'est un exercice pour le lecteur 😛

Ceci est une autre façon de mélanger le data.frame utilisant le paquet dplyr :

en ligne:

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

ou

 df2 <- sample_frac(df1, 1L) 

Par colonne:

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

Échantillons aléatoires et permutations dans un dataframe S’il est sous forme de masortingce converti en data.frame, utilisez la fonction exemple à partir des index du package de base = sample (1: nrow (df1), size = 1 * nrow (df1))