【问题标题】:create random subsets in R without duplicates在 R 中创建没有重复的随机子集
【发布时间】:2013-11-24 12:57:23
【问题描述】:

我的任务是将一个包含 32 行的数据集分成 8 个组,并且没有重复的条目。 我正在尝试通过循环并在每个循环后创建一个新数据集来做到这一点。

数据:

  year pos country  elo fifa          cont hcountry  hcont
1  2010         FRA 1851 1044        Europe      RSA Africa
2  2010         MEX 1872  895 South America      RSA Africa
3  2010         URU 1819  899 South America      RSA Africa
4  2010         RSA 1569  392        Africa      RSA Africa
5  2010         GRE 1726  964        Europe      RSA Africa
6  2010         KOR 1766  632          Asia      RSA Africa
8  2010         ARG 1899 1076 South America      RSA Africa
9  2010         USA 1749  957 North America      RSA Africa
10 2010         SVN 1648  860        Europe      RSA Africa
11 2010         ALG 1531  821        Africa      RSA Africa

...

到目前为止我的解决方案:

for (i in 1:8){
assign(paste("group", i, sep = ""), droplevels(subset(wc2010[sample(nrow(wc2010), 4),])))
wc2010 <- subset(wc2010, !(country %in% group[i]$country))
}

问题当然是:我不知道如何使用循环变量.... :-(

我们将不胜感激! 谢谢 鲍勃

【问题讨论】:

  • 如果我们查看所有列,您的示例数据不包含任何重复项。因为是的,WC 上有 32 个不同的 国家...那么当称事物重复时,您会考虑哪些字段子集?
  • 或者我现在明白了...通过避免重复,您的意思是每个国家/地区都应该归入一个并且恰好是一个组。这称为分区

标签: r


【解决方案1】:

这是创建随机分区的一种方法:

random.groups <- function(n.items = 32L, n.groups = 8L)
  1L + (sample.int(n.items) %% n.groups)

那么你只需要这样做:

wc2010$group <- random.groups(nrow(wc2010), n.groups = 8L)

那你可能也有兴趣做

groups <- split(wc2010, wc2010$group)

编辑:OP 没有问这个问题,但我意识到大型锦标赛的足球抽签通常涉及帽子:在抽签之前,球队按地区分组,并且/或排名。然后通过从每顶帽子中随机挑选一个团队来组成小组,这样来自同一帽子的两支队伍就不会在同一组中结束。

这是对我的函数的修改,因此它也可以将帽子作为输入:

random.groups <- function(n.items = 32L, n.groups = 8L,
                          hats = rep(1L, n.items)) {

  splitted.items  <- split(seq.int(n.items), hats)

  shuffled <- lapply(splitted.items, sample)

  1L + (order(unlist(shuffled)) %% n.groups)
}

这里是一个例子,比如前 8 支球队在帽子 1,接下来的 8 支球队在帽子 #2,等等:

# set.seed(123)
random.groups(32, 8, c(rep(1, 8), rep(2, 8), rep(3, 8), rep(4, 8)))
# [1] 7 8 2 6 5 3 1 4 8 7 5 3 2 4 1 6 3 2 7 6 5 8 1 4 7 6 5 4 3 2 1 8

【讨论】:

  • 那就更好了! :-) 如果您对数据集感兴趣:这当然是(相当古老的)kaggle 比赛link
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多