Chia dữ liệu thành N nhóm bằng nhau


11

Tôi có một khung dữ liệu chứa các giá trị trên 4 cột:

Ví dụ: ID, price, click count,rating

Điều tôi muốn làm là "chia" khung dữ liệu này thành N nhóm khác nhau trong đó mỗi nhóm sẽ có số lượng hàng bằng nhau với cùng phân phối giá, số lần nhấp và xếp hạng thuộc tính.

Mọi lời khuyên đều được đánh giá cao, vì tôi không có ý tưởng nhỏ nhất về cách giải quyết vấn đề này!


Bạn chỉ đang tìm cách tạo N khung dữ liệu riêng biệt tách rời các tập hợp con của bản gốc? Bạn có ý nghĩa gì bởi "cùng phân phối" giá, số lần nhấp và xếp hạng?
Alex A.

Có, tìm kiếm các tập hợp con của khung dữ liệu gốc. Ở câu hỏi thứ hai của bạn, giả sử tôi có các giá trị về số lượt truy cập từ 1 đến 10 và quyết định tạo 3 tập hợp con khác nhau, vì vậy sẽ chọn một số hàng trong mỗi nhóm từ 1 đến 4 số lượt truy cập, một số hàng từ 4 đến 7 lượt đếm số lượt truy cập và một số từ 7 đến 10 lượt đếm số lượt truy cập và điều này cần được thỏa mãn đối với tất cả các thuộc tính (giá, số lần nhấp và xếp hạng). Nó giống như lấy mẫu dữ liệu thành các nhóm khác nhau với xác suất thuộc tính bằng nhau. Hi vọng điêu nay co ich.


Câu hỏi yêu cầu một phân chia bảo tồn các phân phối của các biến. Nếu không có thêm thông tin, không thể xác định phương pháp chính xác để tiếp cận vấn đề này. Tôi bỏ phiếu để di chuyển cái này sang CV.com
DWin 30/03/2015

Bạn có nghĩa là chỉ bảo tồn các phân phối biên hoặc phân phối chung?
kjetil b halvorsen

Câu trả lời:


12

Nếu tôi hiểu chính xác câu hỏi, điều này sẽ giúp bạn có được những gì bạn muốn. Giả sử khung dữ liệu của bạn được gọi dfvà bạn đã Nxác định, bạn có thể làm điều này:

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

Điều này sẽ trả về một danh sách các khung dữ liệu trong đó mỗi khung dữ liệu bao gồm các hàng được chọn ngẫu nhiên từ đó df. Theo mặc định sample()sẽ gán xác suất bằng nhau cho mỗi nhóm.


6

Đây là một câu trả lời rất muộn, nhưng tôi đã tìm thấy trang này trong khi tìm hiểu xem vấn đề như đã nêu có bao giờ được thảo luận ở bất cứ đâu không. Có lẽ câu trả lời của tôi sẽ giúp nếu ai đó tìm thấy trang này từ bây giờ.

Tôi đã viết một gói R, trong đó thực hiện chính xác những gì câu hỏi yêu cầu: nó cần một data.framevà tạo N nhóm khác nhau trong khi cố gắng giảm thiểu sự khác biệt giữa các nhóm trong một hoặc một vài tiêu chí. Nó sử dụng một phương thức đơn giản dựa trên sự phân công ngẫu nhiên lặp đi lặp lại , đây cũng là phương pháp được đề xuất trong phản hồi được phê duyệt.

Đây là liên kết đến gói minDiff :

Để giải quyết vấn đề đã nêu, bạn có thể sử dụng:

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

Đối repetitionssố sẽ xác định tần suất bạn tạo ngẫu nhiên các nhóm khác nhau. Nhiệm vụ tốt nhất - nhóm có sự khác biệt tối thiểu giữa các nhóm - sẽ được trả lại.


5

Mặc dù câu trả lời của Alex A đưa ra xác suất bằng nhau cho mỗi nhóm, nhưng nó không đáp ứng yêu cầu của câu hỏi để các nhóm có số lượng hàng bằng nhau. Trong R:

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

3
Quan sát của bạn về những thiếu sót của câu trả lời được chấp nhận là một điều tốt. Tuy nhiên, câu trả lời của bạn vẫn không giải quyết được phần câu hỏi đáng quan tâm (và là lý do duy nhất chưa được đóng ở đây): làm thế nào để bạn đạt được "cùng phân phối giá, số lần nhấp và thuộc tính xếp hạng" trong mỗi nhóm ?
whuber

@whuber Bạn có thể đề xuất một câu trả lời cho điều đó ở đây?
Léo Léopold Hertz 6/11/2016

Câu trả lời phải phụ thuộc vào "cùng phân phối" nghĩa là gì. Có vẻ như câu hỏi đang yêu cầu quan sát cụm dựa trên bốn biến, với mỗi cụm có cùng số lượng quan sát. Có vô số cách để làm điều này.
whuber

0

Điều này có thể được giải quyết với việc lồng nhau bằng cách sử dụng tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.