我还在学习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)
我想从每个部分中随机选择一个星际迷航角色,最后得到2组4个。我希望整行的信息能够转换为包含所有组及其相应组号的新数据框。 。
答案 0 :(得分:5)
我会使用精彩的套装'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
%&gt;%表示'然后'
代码读作:
对所有'Section'取DF和THEN,按位置(切片)1或2选择.Voila。
答案 1 :(得分:1)
我想你有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)
答案 2 :(得分:1)
首先,我将数据框分成几个部分:
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和stackoverflow的新手,但随着我学到更多,我希望得到回报。
答案 3 :(得分:1)
我建议randomizr
包根据章节“阻止分配”。 block_ra
功能允许您以易于阅读的单行方式执行此操作。
install.packages("randomizr")
library(randomizr)
df$group <- block_ra(block_var = df$Section,
condition_names = c("group_1", "group_2"))
您可以通过多种方式检查结果集。这是基础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
答案 4 :(得分:0)
如果你想自己动手:
set <- tapply(1:nrow(df), df$Section, FUN = sample, size = 1)
df[set,] # show the sampled set
df[-set,] # show the complimentary set