我有一个数据框,其中包含 4 列的值:
例如:ID
, price
, click count
,rating
我想做的是将此数据框“拆分”为 N 个不同的组,其中每个组将具有相同数量的行,具有相同的价格分布、点击次数和评级属性。
强烈感谢任何建议,因为我对如何解决这个问题一无所知!
我有一个数据框,其中包含 4 列的值:
例如:ID
, price
, click count
,rating
我想做的是将此数据框“拆分”为 N 个不同的组,其中每个组将具有相同数量的行,具有相同的价格分布、点击次数和评级属性。
强烈感谢任何建议,因为我对如何解决这个问题一无所知!
如果我正确理解了这个问题,这将为您提供您想要的。假设您的数据框被调用df
并且您已经N
定义,您可以这样做:
split(df, sample(1:N, nrow(df), replace=T))
这将返回一个数据框列表,其中每个数据框都由从 中随机选择的行组成df
。默认情况下sample()
,将为每个组分配相等的概率。
这是一个很晚的答案,但我在谷歌搜索是否曾在任何地方讨论过上述问题时发现了这个页面。如果从现在开始有人找到此页面,也许我的回答会有所帮助。
我写了一个 R 包,它完全符合问题的要求:它需要一个data.frame
并创建 N 个不同的组,同时试图最小化一个或多个标准中组之间的差异。它使用基于重复随机分配的简单方法,这也是批准的响应中建议的方法。
这是包 minDiff的链接:
要解决所述问题,您可以使用:
library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)
该repetitions
参数将确定您随机创建不同组的频率。将返回最佳分配 - 组间差异最小的分配。
尽管 Alex A 的答案为每个组提供了相等的概率,但它不满足问题要求组具有相等行数的要求。在 R 中:
stopifnot(nrow(df) %% N == 0)
df <- df[order(runif(nrow(df))), ]
bins <- rep(1:N, nrow(df) / N)
split(df, bins)
这可以通过使用 tidyr/dplyr 进行嵌套来解决
require(dplyr)
require(tidyr)
num_groups = 10
iris %>%
group_by((row_number()-1) %/% (n()/num_groups)) %>%
nest %>% pull(data)
```