我的任务是将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))
}
问题当然是:我不知道如何使用循环变量....: - (
帮助将深表感谢! 谢谢 鲍勃
答案 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