在R中为每组随机选择数字(无重复)
我有下面的数据框,其中包含一个可变组和每个组的可变元素数在R中为每组随机选择数字(无重复),r,random,dataset,R,Random,Dataset,我有下面的数据框,其中包含一个可变组和每个组的可变元素数 group elements 1 3 2 1 3 14 4 10 .. .. .. .. 30 5 然后我有一组从1到30的数字 当对元素求和时,我会得到900。我想要得到的是从1-30中随机选择一个从0到30的数字,并将其分配给每个组,直到我填充该组的元素数。每一个都应该总共出现30次 因此,对于第1组,我想从0到30之间随机选择3个数字
group elements
1 3
2 1
3 14
4 10
.. ..
.. ..
30 5
然后我有一组从1到30的数字
当对元素求和时,我会得到900。我想要得到的是从1-30中随机选择一个从0到30的数字,并将其分配给每个组,直到我填充该组的元素数。每一个都应该总共出现30次
因此,对于第1组,我想从0到30之间随机选择3个数字
对于第2组,1个数字从0到30,以此类推,直到我填满所有组
最后一个表应该如下所示:
group number(randomly selected)
1 7
1 20
1 7
2 4
3 21
3 20
...
有没有关于如何实现这一目标的建议?试试看:
df <- read.table(text = "group elements
1 3
2 1
3 14
4 10
30 5", header = TRUE)
# reproducibility
set.seed(1)
df_split2 <- do.call("rbind",
(lapply(split(df, df$group),
function(m) cbind(m,
`number(randomly selected)` =
sample(1:30, replace = TRUE,
size = m$elements),
row.names = NULL
))))
# remove element column name
df_split2$elements <- NULL
head(df_split2)
#> group number(randomly selected)
#> 1.1 1 25
#> 1.2 1 4
#> 1.3 1 7
#> 2 2 1
#> 3.1 3 2
#> 3.2 3 29
split函数根据group列将df拆分为块。然后,我们获取这些较小的数据帧,并通过每次1:30的元素采样向其添加一列。然后我们就这样做了。在这个列表上调用rbind一起返回 在R底,如果你有这样的df
df
group elements
1 3
2 1
3 14
然后你可以这样做
data.frame(group = rep(df$group, #repeat group no...
df$elements), #elements times
number = unlist(sapply(df$elements, #for each elements...
sample.int, #...sample <elements> numbers
n=30, #from 1 to 30
replace = FALSE))) #without duplicates
group number
1 1 19
2 1 15
3 1 28
4 2 15
5 3 20
6 3 18
7 3 27
8 3 10
9 3 23
10 3 12
11 3 25
12 3 11
13 3 14
14 3 13
15 3 16
16 3 26
17 3 22
18 3 7
您必须生成一个新的数据帧,重复$group$元素次,然后使用sample您可以生成随机数的确切数目:
data<-data.frame(group=c(1,2,3,4,5),
elements=c(2,5,2,1,3))
data.elements<-data.frame(group=rep(data$group,data$elements),
number=sample(1:30,sum(data$elements)))
我的解决办法如下:
random_sample <- rep(1:30, each=30)
random_sample <- sample(random_sample)
然后我用这个变量和一个变量创建一个df,该变量包含一个组,每行由组本身的元素数重复为什么我们不能一次为所有组选择从0到30的n个数字?当求和numb时,我会得到900-什么是numb-不确定是否要在结果中重复。您的问题表明您没有,但您的示例在第1组中有两个7。要消除重复,只需在调用sample时将replace=TRUE更改为replace=FALSE即可。我的意思是,每次重复次数不超过30次。每个数字都应该总共采样30次Hi实际上我想要重复30次每个数字都应该出现30次,我有30组元素的总数是900 30 x 30在这种情况下,你可以只做上面的number=sampleP1:30,30,这将产生一个长度为900的向量,以1:30的比例随机重复30次,忽略小组。
random_sample <- rep(1:30, each=30)
random_sample <- sample(random_sample)