Разделить данные на N равных групп


11

У меня есть датафрейм, который содержит значения в 4 столбцах:

Например: ID, price, click count,rating

Я хотел бы «разбить» этот фрейм данных на N разных групп, где каждая группа будет иметь одинаковое количество строк с одинаковым распределением цены, количества кликов и атрибутов рейтингов.

Любой совет очень важен, так как я не имею ни малейшего представления о том, как с этим справиться!


Вы просто хотите создать N отдельных фреймов данных, которые являются непересекающимися подмножествами оригинала? Что вы подразумеваете под "одинаковым распределением" цены, количества кликов и рейтингов?
Алекс А.

Да, ищет подмножества исходного кадра данных. Что касается вашего второго вопроса, предположим, что у меня есть значения количества посещений от 1 до 10, и я решил создать 3 разных подмножества, поэтому выберу несколько строк в каждой группе от 1 до 4 сегментов посещений, некоторые строки от 4 до 7 сегментов посещений и у некоторых от 7 до 10 посещений, и это должно быть удовлетворено по всем атрибутам (цена, количество кликов и рейтинг). Это похоже на выборку данных в разные группы с равной вероятностью атрибутов. Надеюсь это поможет.

Возможная копия языка R: как разбить фрейм данных
Алекс А.

Вопрос требует разбиения, которое сохраняет распределения переменных. Без дополнительной информации невозможно определить правильный метод решения этой проблемы. Я голосую, чтобы перенести это на CV.com
DWin

Вы хотите сохранить только предельные распределения или совместное распределение?
kjetil b halvorsen

Ответы:


12

Если я правильно понимаю вопрос, это даст вам то, что вы хотите. Предполагая, что ваш фрейм данных вызван, dfи вы Nопределили, вы можете сделать это:

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

Это вернет список фреймов данных, где каждый фрейм данных состоит из случайно выбранных строк df. По умолчанию sample()назначит равную вероятность каждой группе.


6

Это очень поздний ответ, но я нашел эту страницу, когда гуглял, обсуждалась ли когда-либо обсуждаемая проблема где-либо. Возможно, мой ответ поможет, если кто-то найдет эту страницу отныне.

Я написал пакет R, который делает именно то, о чем спрашивал вопрос: он принимает data.frameи создает N разных групп, пытаясь минимизировать различия между группами по одному или нескольким критериям. Он использует простой метод, основанный на повторном случайном присвоении, который также является предлагаемым методом в утвержденном ответе.

Это ссылка на пакет minDiff :

Чтобы решить указанную проблему, вы можете использовать:

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

repetitionsАргумент определяет , как часто вы случайным образом создавать различные группы. Лучшее задание - с минимальными различиями между группами - будет возвращено.


5

Хотя ответ Алекса А дает равную вероятность для каждой группы, он не соответствует запросу вопроса о том, чтобы группы имели одинаковое количество строк. В R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)

3
Ваше замечание о недостатках принятого ответа является хорошим. Однако ваш ответ по-прежнему не затрагивает интересующую вас часть вопроса (и это единственная причина, по которой он здесь не закрыт): как добиться «одинакового распределения цены, количества кликов и атрибутов рейтинга» в каждой группе ?
whuber

@whuber Можете ли вы предложить ответ здесь?
Лео Леопольд Герц 준영

Ответ должен зависеть от того, что означает «то же распределение». Похоже, что вопрос состоит в том, чтобы объединить наблюдения на основе четырех переменных, причем каждый кластер имеет одинаковое количество наблюдений. Есть множество способов сделать это.
whuber

0

Это можно решить с помощью вложенности, используя tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.