I have a string g <- c(1979:2020) and I would like to create 8 random groups of 4 years each and two with 5 years without replacement. What I do is:
group1 <- sample(g, size = 4)
g1 <- g[!(g %in% group1)]
group2 <- sample(g1, size = 4)
g2 <- g[!(g %in% group2)] etc
Is there a smarter way to do that?
You can create the entire vector with sample
and size = length(g)
, and then create groups by splitting it every four elements for the first 8 groups (with gl
) and then 5 times for the two remaining group.
sample(g, size = length(g)) |>
split(c(gl(8, 4), gl(2, 5, labels = 9:10)))
Or, in a for loop, you can do:
g <- c(1979:2020)
l <- vector(10, mode = "list")
for (i in seq(10)){
if(i %in% seq(8)){
l[[i]] <- sample(g, size = 4)
g <- g[!(g %in% unlist(l))]
}
else if (i %in% 9:10){
l[[i]] <- sample(g, size = 5)
g <- g[!(g %in% unlist(l))]
}
}
output:
#> l
[[1]]
[1] 2010 1980 1983 2014
[[2]]
[1] 2019 2004 1990 1997
[[3]]
[1] 1981 1992 1979 2018
[[4]]
[1] 1986 2005 2008 2003
[[5]]
[1] 1987 1984 1996 1985
[[6]]
[1] 1982 1993 2020 2006
[[7]]
[1] 1995 1994 2017 1998
[[8]]
[1] 1989 1999 2012 1991
[[9]]
[1] 2013 2009 2016 2002 2000
[[10]]
[1] 2001 2015 1988 2007 2011