Dividir datos en N grupos iguales

11

Tengo un marco de datos que contiene valores en 4 columnas:

Por ejemplo: ID, price, click count,rating

Lo que me gustaría hacer es "dividir" este marco de datos en N grupos diferentes donde cada grupo tendrá el mismo número de filas con la misma distribución de precios, recuento de clics y atributos de calificación.

Cualquier consejo es muy apreciado, ya que no tengo la menor idea de cómo abordar esto.

Rajpal Kulhari
fuente
¿Está buscando crear N marcos de datos separados que son subconjuntos disjuntos del original? ¿Qué quiere decir con la "misma distribución" de precio, número de clics y calificaciones?
Alex A.
Sí, buscando los subconjuntos del marco de datos original. En su segunda pregunta, supongamos que tengo valores de recuentos de visitas de 1 a 10 y decidí crear 3 subconjuntos diferentes, por lo que seleccionaré algunas filas en cada grupo de 1 a 4 grupos de recuento de visitas, algunas filas de 4 a 7 grupos de recuento de visitas y algunos de 7 a 10 visitas cuentan y esto debe satisfacerse con respecto a todos los atributos (precio, recuento de clics y calificación). Es como muestrear los datos en diferentes grupos con la misma probabilidad de atributos. Espero que esto ayude.
posible duplicado del lenguaje R: cómo dividir un marco de datos
Alex A.
La pregunta solicita una división que preserva las distribuciones de las variables. Sin más información, no es posible determinar el método correcto con el cual abordar este problema. Voto para migrar esto a CV.com
DWin
¿Te refieres a preservar solo las distribuciones marginales o la distribución conjunta?
kjetil b halvorsen

Respuestas:

12

Si entiendo la pregunta correctamente, esto te dará lo que quieres. Suponiendo que se llama a su marco de datos dfy lo ha Ndefinido, puede hacer esto:

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

Esto devolverá una lista de marcos de datos donde cada marco de datos consiste en filas seleccionadas al azar df. Por defecto sample()asignará la misma probabilidad a cada grupo.

Alex A.
fuente
6

Esta es una respuesta muy tardía, pero encontré esta página mientras buscaba en Google si el problema como se ha mencionado alguna vez se ha discutido en alguna parte. Tal vez mi respuesta ayude si alguien encuentra esta página de ahora en adelante.

Escribí un paquete R, que hace exactamente lo que pedía la pregunta: toma un data.framey crea N grupos diferentes al intentar minimizar las diferencias entre grupos en uno o varios criterios. Utiliza un método simple basado en la asignación aleatoria repetida , que también es el método sugerido en la respuesta aprobada.

Este es el enlace al paquete minDiff :

Para abordar el problema declarado, puede usar:

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

El repetitionsargumento determinará con qué frecuencia crea aleatoriamente diferentes grupos. Se devolverá la mejor asignación, la que tiene diferencias mínimas entre los grupos.

M. Papenberg
fuente
5

Aunque la respuesta de Alex A ofrece la misma probabilidad para cada grupo, no cumple con la solicitud de la pregunta de que los grupos tengan el mismo número de filas. En R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)
Scott Kaiser
fuente
3
Su observación sobre las deficiencias de la respuesta aceptada es buena. Sin embargo, su respuesta aún no aborda la parte de la pregunta que es de interés (y es la única razón por la que no se cerró aquí): ¿cómo se logra la "misma distribución de precios, recuento de clics y atributos de calificación" en cada grupo ?
whuber
@whuber ¿Puedes proponer una respuesta a eso aquí?
Léo Léopold Hertz 준영
La respuesta debería depender de lo que significa "misma distribución". Parece que la pregunta es agrupar observaciones basadas en cuatro variables, con cada grupo teniendo el mismo número de observaciones. Hay miles de formas de hacer esto.
whuber
0

Esto se puede resolver con anidamiento usando tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

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