将数据分为N个相等的组


11

我有一个数据框,其中包含4列中的值:

例如:IDpriceclick countrating

我想做的是将此数据帧“拆分”为N个不同的组,其中每个组将具有相同数量的行,且行,点击数和评级属性的分布相同。

任何建议都将受到高度赞赏,因为我对如何解决这个问题丝毫不了解!


您是否只是想创建N个单独的数据帧,这些数据帧是原始数据的不相交的子集?您对价格,点击次数和评分的“相同分配”是什么意思?
Alex A.

是的,正在寻找原始数据帧的子集。关于第二个问题,假设我的访问计数值为1到10,并决定创建3个不同的子集,因此将从1到4访问计数存储桶中的每个组中选择一些行,从4到7访问计数存储桶中选择一些行,某些访问次数范围是7到10,这在所有属性(价格,点击次数和评分)方面都应得到满足。这就像以相同的属性概率将数据采样到不同的组中一样。希望这可以帮助。


该问题要求进行拆分,以保留变量的分布。没有更多的信息,就不可能确定解决此问题的正确方法。我投票将其迁移到CV.com
DWin 2015年

您是要保留边际分布还是联合分布?
kjetil b halvorsen

Answers:


12

如果我正确理解了这个问题,那么您会得到想要的东西。假设已调用数据框dfN定义了数据框,则可以执行以下操作:

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

尽管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éopoldHertz)2016年

答案应该取决于“相同分配”的含义。看来问题是要根据四个变量对观察值进行聚类,每个聚类具有相同数量的观察值。有许多方法可以做到这一点。
ub

0

可以使用tidyr / dplyr嵌套解决

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.