在R中创建随机子集而不重复

时间:2013-11-24 12:57:24

标签: r

我的任务是将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))
}

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

帮助将深表感谢! 谢谢 鲍勃

1 个答案:

答案 0 :(得分: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没有问过这个问题,但我意识到足球比赛通常涉及 hats :在抽签之前,球队按地区分组/或排名。然后通过从每个帽子中随机挑选一个团队来组成团队,这样来自同一个帽子的两个团队就不能在同一个团队中结束。

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

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个队伍排在第一位,接下来的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