Comment rendre aléatoire (ou permuter) un dataframe rowwise et columnwise?
J'ai un dataframe (df1) comme ceci.
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 d1...d4 colonne est la rowname, la f1...f5 ligne est columnname.
À faire de l'échantillon(df1), je reçois un nouveau dataframe avec le comte de 1 même que df1. Ainsi, le nombre de 1 est conservée pour l'ensemble du dataframe, mais pas pour chaque ligne ou chaque colonne.
Est-il possible de faire la randomisation de la ligne ou de la colonne sage?
Je veux rendre aléatoire le df1 les colonnes pour chaque colonne, c'est à dire le nombre de 1 dans chaque colonne reste le même. et chaque colonne doivent être changés au moins une fois. Par exemple, j'ai peut-être une étude randomisée df2 comme ceci: (a Noté que le nombre de 1 dans chaque colonne reste le même, mais le nombre de 1 dans chaque ligne est différente.
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 tiens également à rendre aléatoire le df1 ligne sage pour chaque ligne, c'est à dire le pas. de 1 dans chaque ligne reste la même, et chaque ligne besoin d'être changé (mais pas de changé les entrées peuvent être différents). Par exemple, une étude randomisée df3 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 pour l'aide à partir de Gavin Simpson, Joris Meys et de la chasse pour les réponses à ma question précédente sur la randomisation des deux colonnes.
- vous voulez permuter les lignes et les colonnes en même temps. En relisant cela, il semble que la contrainte de colonne (même nombre de 1 dans chaque colonne) ne tient pas dans votre deuxième exemple permutant les lignes.
- S'il vous plaît ne pas signer pour plusieurs comptes. J'ai demandé à la modération de fusionner le compte que vous avez utilisé ici est celle qui est utilisée sur les précédentes Q.
Vous devez vous connecter pour publier un commentaire.
Compte tenu de la R de données.cadre:
Shuffle ligne-sage:
Par défaut
sample()
au hasard réorganise les éléments du passé comme premier argument. Cela signifie que la taille par défaut est la taille du tableau transmis. Passage de paramètrereplace=FALSE
(valeur par défaut) poursample(...)
assure que l'échantillonnage est fait sans remplacement qui accomplit une ligne sage shuffle.Shuffle colonnes:
C'est une autre façon aléatoire les
data.frame
à l'aide de paquetdplyr
:ligne-sage:
ou
colonnes:
Prendre un coup d'oeil à
permatswap()
dans le végétalien paquet. Voici un exemple de maintenir à la fois la ligne et de la colonne des totaux, mais vous pourrez vous détendre et fixer un seul de la ligne ou de la colonne sommes.Cela donne:
Pour expliquer l'appel:
times
est le nombre de matrices aléatoires que vous voulez, ici 99burnin
est le nombre de contrats de swaps de fait avant de commencer la prise d'échantillons aléatoires. Cela permet à la matrice à partir de laquelle nous l'échantillon doit être assez aléatoire avant de commencer à prendre chacune de nos matrices aléatoiresthin
dit seulement prendre un tirage au sort chaquethin
swapsmtype = "prab"
dit traiter la matrice de présence/absence, c'est à dire binaire 0/1 données.Un couple de choses à noter, cela ne garantit pas que toute la colonne ou de la ligne a été randomisé, mais si
burnin
est assez long il devrait y avoir une bonne chance de l'avoir passé. Aussi, vous pouvez attirer plus de matrices aléatoires que vous avez besoin et jetez celles qui ne correspondent pas à toutes vos exigences.Votre condition d'avoir un nombre différent de changements par ligne, n'est pas couvert ici. Encore une fois, vous pouvez essayer plus de matrices que vous voulez et ensuite éliminer ceux qui ne répondent pas à cette exigence aussi.
vous pouvez également utiliser le
randomizeMatrix
fonction dans le package Rpicante
exemple:
L'option
null.model="frequency"
maintient la colonne sommes etrichness
maintient la ligne de sommes.Bien que principalement utilisé pour la randomisation la présence d'espèces absence ensembles de données en écologie des communautés, il fonctionne bien ici.
Cette fonction a d'autres modèle nul options, découvrez lien suivant pour plus de détails (page 36) de la
picante
de la documentationBien sûr, vous pourrez déguster chaque ligne:
mélange les lignes lui-même, de sorte que le nombre de
1
's dans chaque ligne ne change pas. De petits changements, et il fonctionne également bien avec des colonnes, mais c'est un exercice pour le lecteur 😛Vous pouvez aussi faire un "échantillon" le même nombre d'éléments dans votre bloc de données avec quelque chose comme ceci:
dim(M)[1]
, vous pouvez utilisernrow(M)
donc l'ensemble de la procédure devient un one-liner:random_M <- M[nrow(M),]
Échantillons aléatoires et les Permutations de l'ina dataframe
Si c'est sous forme de matrice de les convertir en données.cadre
utiliser l'exemple de la fonction à partir du package de base
index = sample(1:nrow(df1), taille=1*nrow(df1))
Des Échantillons aléatoires et les Permutations de
Si l'objectif est de façon aléatoire shuffle chaque colonne, certaines des réponses ci-dessus ne fonctionnent pas car les colonnes sont mélangés conjointement (ce qui préserve inter-colonne de corrélations). D'autres nécessitent l'installation d'un paquet. Encore un one-liner existent: