2013-11-24 37 views
1

我的任务是将32行的数据集分成8个组,没有重复的条目。 我试图用循环和每个循环后创建一个新的数据集。在R中创建随机子集无重复

数据:

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

如果我们查看所有列,您的示例数据不包含任何重复项。因为是的,WC上有32个*不同的国家......那么当你调用重复的东西时,你考虑了哪些子领域? – flodel

+0

或者我现在明白了......通过避免重复,你的意思是每个国家都应该进入一个团队,并且只能进入一个团队。这就是所谓的*分区*。 – flodel

回答

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 
+0

,这工作只是辉煌!非常感谢!! – user3027205

+0

多数民众赞成在更好! :-)如果你在数据集中发生冲突:它当然是一个(相当老的)kaggle竞争[link](http://www.kaggle.com/c/worldcup2010) – user3027205