Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中为每组随机选择数字(无重复)_R_Random_Dataset - Fatal编程技术网

在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)