Eu tenho um dataframe (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
A coluna d1 ... d4 é o nome da linha, a linha f1 ... f5 é o nome da coluna.
Para fazer o sample (df1), obtenho um novo dataframe com contagem de 1 igual a df1. Portanto, a contagem de 1 é conservada para todo o dataframe, mas não para cada linha ou coluna.
É possível fazer a randomização por linha ou por coluna?
Quero randomizar o df1 por coluna para cada coluna, ou seja, o número 1 em cada coluna permanece o mesmo. e cada coluna precisa ser alterada pelo menos uma vez. Por exemplo, posso ter um df2 aleatório como este: (Observe que a contagem de 1 em cada coluna permanece a mesma, mas a contagem de 1 em cada linha é 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
Da mesma forma, também quero randomizar o df1 por linha para cada linha, ou seja, o não. de 1 em cada linha permanece o mesmo e cada linha precisa ser alterada (mas o número de entradas alteradas pode ser diferente). Por exemplo, um df3 aleatório poderia ser algo assim:
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. Muito obrigado pela ajuda de Gavin Simpson, Joris Meys e Chase pelas respostas anteriores à minha pergunta anterior sobre a randomização de duas colunas.
fonte
Respostas:
Dado o R data.frame:
Ordem aleatória:
Por padrão,
sample()
reordena aleatoriamente os elementos passados como o primeiro argumento. Isso significa que o tamanho padrão é o tamanho do array passado. Passar parâmetroreplace=FALSE
(o padrão) parasample(...)
garantir que a amostragem seja feita sem substituição, o que realiza uma ordem aleatória de linha.Ordem aleatória de colunas:
fonte
Esta é outra maneira de embaralhar o
data.frame
pacote usandodplyr
:em linha:
ou
coluna:
fonte
Dê uma olhada
permatswap()
na vegan pacote. Aqui está um exemplo mantendo os totais de linha e coluna, mas você pode relaxar isso e corrigir apenas uma das somas de linha ou coluna.Isto dá:
Para explicar a chamada:
times
é o número de matrizes aleatórias que você deseja, aqui 99burnin
é o número de trocas feitas antes de começarmos a coletar amostras aleatórias. Isso permite que a matriz da qual fazemos a amostra seja bastante aleatória antes de começarmos a tomar cada uma de nossas matrizes aleatóriasthin
diz apenas tirar um sorteio aleatório a cadathin
trocamtype = "prab"
diz tratar a matriz como presença / ausência, ou seja, dados binários 0/1.Algumas coisas a serem observadas, isso não garante que qualquer coluna ou linha tenha sido randomizada, mas se
burnin
for longa o suficiente, deve haver uma boa chance de isso ter acontecido. Além disso, você pode desenhar mais matrizes aleatórias do que precisa e descartar aquelas que não correspondem a todos os seus requisitos.Seu requisito de ter diferentes números de alterações por linha também não é abordado aqui. Novamente, você pode amostrar mais matrizes do que deseja e, em seguida, descartar aquelas que também não atendem a esse requisito.
fonte
você também pode usar a
randomizeMatrix
função no pacote Rpicante
exemplo:
A opção
null.model="frequency"
mantém as somas das colunas erichness
mantém as somas das linhas. Embora seja usado principalmente para randomizar conjuntos de dados de ausência de presença de espécies em ecologia de comunidade, funciona bem aqui.Esta função também tem outras opções de modelo nulo, verifique o seguinte link para mais detalhes (página 36) da documentação
picante
fonte
Claro, você pode experimentar cada linha:
irá embaralhar as próprias linhas, então o número de
1
em cada linha não muda. Pequenas mudanças e também funciona muito bem com colunas, mas este é um exercício para o leitor :-Pfonte
Você também pode "amostrar" o mesmo número de itens em seu quadro de dados com algo assim:
fonte
dim(M)[1]
, você pode usar denrow(M)
forma que todo o procedimento se torne uma linha:random_M <- M[nrow(M),]
Se o objetivo for embaralhar cada coluna aleatoriamente, algumas das respostas acima não funcionam, pois as colunas são embaralhadas em conjunto (isso preserva as correlações entre colunas). Outros requerem a instalação de um pacote. No entanto, existe uma linha única:
fonte
Amostras aleatórias e permutações em dataframe Se estiver na forma de matriz, converta em data.frame use a função de amostra dos índices de pacote de base = amostra (1: nrow (df1), tamanho = 1 * nrow (df1)) Amostras aleatórias e permutações
fonte