แบ่งข้อมูลออกเป็น N กลุ่มเท่ากัน


11

ฉันมีชื่อไฟล์ซึ่งมีค่าใน 4 คอลัมน์:

ตัวอย่างเช่น: ID, price, click count,rating

สิ่งที่ฉันอยากทำคือ "แบ่ง" ดาต้าเบสนี้เป็น N กลุ่มที่แตกต่างกันซึ่งแต่ละกลุ่มจะมีจำนวนแถวเท่ากันโดยมีการกระจายราคาเดียวกันคลิกนับและแอตทริบิวต์การให้คะแนน

คำแนะนำใด ๆ ที่ชื่นชมอย่างมากเนื่องจากฉันไม่มีความคิดเพียงเล็กน้อยเกี่ยวกับวิธีการแก้ไขปัญหานี้!


คุณเพียงแค่ต้องการสร้างเฟรมข้อมูล N ที่แยกจากกันซึ่งเป็นชุดย่อยที่แยกจากเดิมหรือไม่ คุณหมายถึงอะไรโดย "การกระจายตัว" ของราคาจำนวนคลิกและการให้คะแนน
Alex A.

ใช่มองหาเซตย่อยของ data frame ต้นฉบับ สำหรับคำถามที่สองของคุณสมมติว่าฉันมีค่าจำนวนการเข้าชมตั้งแต่ 1 ถึง 10 และตัดสินใจที่จะสร้างชุดย่อยที่แตกต่างกัน 3 ชุดดังนั้นจะเลือกแถวในแต่ละกลุ่มจากกลุ่มการนับการเยี่ยมชม 1 ถึง 4 ตัว ช่วงการนับจำนวนเยี่ยมชม 7-10 ครั้งและควรพอใจกับแอตทริบิวต์ทั้งหมด (ราคาจำนวนคลิกและคะแนน) มันเหมือนกับการสุ่มตัวอย่างข้อมูลออกเป็นกลุ่มต่าง ๆ ที่มีความน่าจะเป็นของแอตทริบิวต์เท่ากัน หวังว่านี่จะช่วยได้

มีความซ้ำซ้อนของภาษา R: วิธีแยกเฟรมข้อมูล
Alex A.

คำถามที่ขอแยกที่รักษาการกระจายของตัวแปร หากไม่มีข้อมูลเพิ่มเติมจะไม่สามารถกำหนดวิธีการแก้ไขปัญหานี้ได้อย่างถูกต้อง ผมออกเสียงลงคะแนนในการโยกย้ายนี้เพื่อ CV.com
dwin

คุณหมายถึงการรักษาเฉพาะการกระจายส่วนเพิ่มหรือการกระจายข้อต่อ
kjetil b halvorsen

คำตอบ:


12

ถ้าฉันเข้าใจคำถามอย่างถูกต้องสิ่งนี้จะทำให้คุณได้สิ่งที่คุณต้องการ สมมติว่า data frame ของคุณถูกเรียกใช้dfและคุณได้Nกำหนดไว้คุณสามารถทำสิ่งนี้ได้:

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

dfนี้จะกลับรายการของเฟรมข้อมูลที่แต่ละเฟรมข้อมูลประกอบด้วยแถวสุ่มเลือกจาก โดยค่าเริ่มต้นsample()จะกำหนดความน่าจะเป็นเท่ากันให้แต่ละกลุ่ม


6

นี่เป็นคำตอบที่ช้ามาก แต่ฉันพบหน้านี้ในขณะที่ googling ว่าปัญหาดังกล่าวเคยมีการพูดคุยกันทุกที่ บางทีคำตอบของฉันอาจช่วยได้ถ้ามีใครพบหน้านี้นับจากนี้

ฉันเขียนแพคเกจ 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

แม้ว่าคำตอบของ Alex A จะให้โอกาสที่เท่าเทียมกันสำหรับแต่ละกลุ่ม แต่ก็ไม่เป็นไปตามคำขอของคำถามสำหรับกลุ่มที่มีจำนวนแถวเท่ากัน ใน 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 คุณสามารถเสนอคำตอบได้ที่นี่หรือไม่?
LéoLéopold Hertz 준영

คำตอบนั้นควรขึ้นอยู่กับความหมายของ "การกระจายตัวแบบเดียวกัน" ดูเหมือนว่าคำถามกำลังขอให้สังเกตกลุ่มตามตัวแปรสี่ตัวโดยแต่ละกลุ่มมีจำนวนการสังเกตเท่ากัน มีวิธีการมากมายในการทำเช่นนี้
whuber

0

สามารถแก้ไขได้ด้วยการซ้อนโดยใช้ tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.