使用 R,随机将学生分成 4 人一组

Using R, Randomly Assigning Students Into Groups Of 4

我仍在学习 R,并接到了一项任务,即根据另一个变量将一长串学生分成四人一组。我已将数据作为数据框加载到 R 中。如何在不替换的情况下对整行进行采样,从变量的 4 个级别中的每个级别中取一个,并让 R 将数据输出到电子表格中?

到目前为止,我一直在修改 for 循环和示例函数,但我很快就忘记了。有什么建议么?这是我正在尝试做的示例。给定:

Last.Name <- c("Picard","Troi","Riker","La Forge", "Yar", "Crusher", "Crusher", "Data")
First.Name <- c("Jean-Luc", "Deanna", "William", "Geordi", "Tasha", "Beverly", "Wesley", "Data")
Email <- c("a@a.com","b@b.com", "c@c.com", "d@d.com", "e@e.com", "f@f.com", "g@g.com", "h@h.com")
Section <- c(1,1,2,2,3,3,4,4)

df <- data.frame(Last.Name,First.Name,Email,Section)

我想从每个部分中随机 select 一个星际迷航角色,最后得到 2 组 4 个。我希望整行的信息价值能够转移到包含所有内容的新数据框中具有相应组号的组。

我假设你有 8 个学生:First.Name <- c("Jean-Luc", "Deanna", "William", "Geordi", "Tasha", "Beverly", "Wesley", "Data")

如果您希望为 8 名学生随机分配一个节号,并假设您希望每个节有 2 名学生,那么您可以排列 Section <- c(1, 1, 2, 2, 3, 3, 4, 4) 或排列学生列表。

第一种方法,排列部分:

> assigned_section <- print(sample(Section))
[1] 1 4 3 2 2 3 4 1

然后下面的数据框给出赋值:

assigned_students <- data.frame(First.Name, assigned_section)

第二种方法,排列学生:

> assigned_students <- print(sample(First.Name))
[1] "Data"     "Geordi"   "Tasha"    "William"  "Deanna"   "Beverly"  "Jean-Luc" "Wesley"  

然后,下面的数据框给出赋值:

assigned_students <- data.frame(assigned_students, Section)

我会使用很棒的包 'dplyr'

require(dplyr)

random_4 <- df %>% group_by(Section) %>% slice(sample(c(1,2),1))

random_4
Source: local data frame [4 x 4]
Groups: Section

  Last.Name First.Name   Email Section
1      Troi     Deanna b@b.com       1
2  La Forge     Geordi d@d.com       2
3   Crusher    Beverly f@f.com       3
4      Data       Data h@h.com       4

random_4
Source: local data frame [4 x 4]
Groups: Section

  Last.Name First.Name   Email Section
1    Picard   Jean-Luc a@a.com       1
2     Riker    William c@c.com       2
3   Crusher    Beverly f@f.com       3
4      Data       Data h@h.com       4

%>% 表示 'and then'

代码读作:

对所有 'Section'、select 按位置(切片)1 或 2 取 DF ANDTHEN。瞧。

亚历克斯,谢谢。您的答案不完全是我想要的,但它激发了我正确的答案。我一直在从一个过于复杂的角度思考这个过程。我决定让 R 为每个学生分配一个随机数,然后按数字对数据框进行排序,而不是将 R select 行放入新的数据框中:

首先,我将数据框分成几个部分:

df1<- subset(df, Section ==1)

df2<- subset(df, Section ==2)

df3<- subset(df, Section ==3)

df4<- subset(df, Section ==4)

然后我随机生成了一个组号 1 到 4。

Groupnumber <-sample(1:4,4, replace=F)

接下来,我告诉 R 绑定列:

Assigned1 <- cbind(df1,Groupnumber)

*运行 组号生成器和 cbind 以交替顺序排列,直到我完成整个集合。 (想确保每个部分的数字顺序是唯一的)。

最后将数据集行绑定在一起:

Final_List<-rbind(Assigned1,Assigned2,Assigned3,Assigned4)

谢谢所有看过这篇文章的人。我是数据科学、R 和 Whosebug 的新手,但随着我了解更多,我希望得到 return 的帮助。

如果您想自己滚动:

set <-  tapply(1:nrow(df), df$Section, FUN = sample, size = 1)
df[set,]    # show the sampled set
df[-set,]   # show the complimentary set

我会根据部分向 "block assign" 建议 randomizr 包。 block_ra 函数可让您在易于阅读的一行中执行此操作。

install.packages("randomizr")
library(randomizr)

df$group <- block_ra(block_var = df$Section, 
             condition_names = c("group_1", "group_2"))

您可以通过多种方式检查结果集。这是 base r 子集:

df[df$group == "group_1",]

  Last.Name First.Name   Email Section   group
2      Troi     Deanna b@b.com       1 group_1
3     Riker    William c@c.com       2 group_1
6   Crusher    Beverly f@f.com       3 group_1
7   Crusher     Wesley g@g.com       4 group_1

df[df$group == "group_2",]

  Last.Name First.Name   Email Section   group
1    Picard   Jean-Luc a@a.com       1 group_2
4  La Forge     Geordi d@d.com       2 group_2
5       Yar      Tasha e@e.com       3 group_2
8      Data       Data h@h.com       4 group_2