Dividir dados em N grupos iguais

11

Eu tenho um quadro de dados que contém valores em 4 colunas:

Por exemplo: ID, price, click count,rating

O que eu gostaria de fazer é "dividir" esse quadro de dados em N grupos diferentes, onde cada grupo terá um número igual de linhas com a mesma distribuição de preço, contagem de cliques e atributos de classificação.

Qualquer conselho é muito apreciado, pois não tenho a menor idéia de como lidar com isso!

Rajpal Kulhari
fonte
Você está olhando apenas para criar N quadros de dados separados que são subconjuntos separados do original? O que você quer dizer com "mesma distribuição" de preço, contagem de cliques e classificações?
Alex A.
Sim, procurando os subconjuntos do quadro de dados original. Na sua segunda pergunta, suponha que eu tenha valores de contagem de visitas de 1 a 10 e decidi criar 3 subconjuntos diferentes, por isso selecionarei algumas linhas em cada grupo de 1 a 4 intervalos de contagem de visitas, algumas linhas de 4 a 7 intervalos de contagem de visitas e algumas das 7 às 10 parcelas de contagem de visitas e isso deve ser satisfeito com relação a todos os atributos (preço, contagem de cliques e classificação). É como amostrar os dados em diferentes grupos com igual probabilidade de atributos. Espero que isto ajude.
possível duplicado da linguagem R: como dividir um quadro de dados
Alex A.
A pergunta solicita uma divisão que preserva as distribuições das variáveis. Sem mais informações, não é possível determinar o método correto para abordar esse problema. Eu voto para migrar isso para o CV.com #
30415 DWin
Você pretende preservar apenas as distribuições marginais ou a distribuição conjunta?
Kjetil b halvorsen

Respostas:

12

Se eu entendi a pergunta corretamente, você obterá o que deseja. Supondo que seu quadro de dados seja chamado dfe você tenha Ndefinido, você pode fazer isso:

split(df, sample(1:N, nrow(df), replace=T))

Isso retornará uma lista de quadros de dados em que cada quadro de dados consiste em linhas selecionadas aleatoriamente df. Por padrão sample(), atribuirá igual probabilidade a cada grupo.

Alex A.
fonte
6

Essa é uma resposta muito tardia, mas encontrei esta página pesquisando se o problema, conforme indicado, já foi discutido em qualquer lugar. Talvez minha resposta ajude se alguém encontrar esta página a partir de agora.

Escrevi um pacote R, que faz exatamente o que a pergunta solicita: é preciso data.framee cria N grupos diferentes enquanto tenta minimizar as diferenças entre os grupos em um ou vários critérios. Ele usa um método simples baseado em atribuição aleatória repetida , que também é o método sugerido na resposta aprovada.

Este é o link para o pacote minDiff :

Para resolver o problema declarado, você pode usar:

library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)

O repetitionsargumento determinará com que frequência você cria aleatoriamente diferentes grupos. A melhor tarefa - a que tiver diferenças mínimas entre os grupos - será retornada.

M. Papenberg
fonte
5

Embora a resposta de Alex A forneça uma probabilidade igual para cada grupo, ela não atende à solicitação da pergunta para que os grupos tenham um número igual de linhas. Em R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)
Scott Kaiser
fonte
3
Sua observação sobre as deficiências da resposta aceita é boa. No entanto, sua resposta ainda não aborda a parte da pergunta que interessa (e é a única razão pela qual não foi encerrada aqui): como você obtém a "mesma distribuição de preço, contagem de cliques e atributos de classificação" em cada grupo ?
whuber
@whuber Você pode propor uma resposta para isso aqui?
Léo Léopold Hertz,
A resposta deve depender do que "mesma distribuição" significa. Parece que a pergunta está pedindo para agrupar observações com base em quatro variáveis, com cada cluster tendo o mesmo número de observações. Existem inúmeras maneiras de fazer isso.
whuber
0

Isso pode ser resolvido com o aninhamento usando tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Holger Brandl
fonte