Розбийте дані на N рівних груп


11

У мене є кадр даних, який містить значення в 4 стовпцях:

Наприклад: ID, price, click count,rating

Що я хотів би зробити, це "розділити" цей кадр даних на N різних груп, де кожна група матиме рівну кількість рядків з однаковим розподілом атрибутів ціни, кількості кліків та рейтингів.

Будь-яка порада дуже вдячна, оскільки я не маю найменшого уявлення про те, як вирішити це!


Ви просто хочете створити N окремих кадрів даних, які є непересічними підмножинами оригіналу? Що ви маєте на увазі під "однаковим розподілом" ціни, кількості кліків та рейтингів?
Алекс А.

Так, шукаємо підмножини вихідного кадру даних. Що стосується вашого другого запитання, припустімо, що у мене є значення кількості відвідувань від 1 до 10, і я вирішив створити 3 різних підмножини, тому виберіть кілька рядків у кожній групі від 1 до 4 відра для кількості відвідувань, кілька рядків від 4 до 7 відра для відвідування та Деякі від 7 до 10 відраховують кількість відвідувань, і це слід задовольнити стосовно всіх атрибутів (ціна, кількість кліків та рейтинг). Це як вибірки даних у різні групи з однаковою ймовірністю атрибутів. Сподіваюсь, це допомагає.


Питання вимагає розбиття, що зберігає розподіли змінних. Без додаткової інформації неможливо визначити правильний метод, з яким можна підійти до цієї проблеми. Я голосую, щоб перенести це на CV.com
DWin

Ви маєте на увазі збереження лише граничних розподілів чи спільного розподілу?
kjetil b halvorsen

Відповіді:


12

Якщо я правильно зрозумію питання, це отримає вам те, що ви хочете. Припустимо, що ваш кадр даних викликається dfі ви Nвизначили, ви можете це зробити:

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

Це поверне список кадрів даних, де кожен кадр даних складається з випадково вибраних рядків df. За замовчуванням sample()для кожної групи призначить рівну ймовірність.


6

Це дуже пізня відповідь, але я знайшов цю сторінку під час гуглінгу, чи не було обговорено де-небудь обговорюваної проблеми. Можливо, моя відповідь допоможе, якщо хтось знайде цю сторінку відтепер.

Я написав пакет R, який робить саме те, що запитували: він займає a 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.